
문제 출저
https://www.acmicpc.net/problem/5076
5076번: Web Pages
Input will consist of a number of lines of HTML code, each line containing from 0 to 255 characters. The last line will contain a single # character – do not process this line. Within the text of each line will be zero or more tags. No angle bracket will
www.acmicpc.net
문제 풀이
String이 #이 나올 때까지 주어집니다.
String이 HTML 태그 형식에 맞는지 확인해서 옳다면 legal, 틀리면 illegal을 출력해야 하는 문제 입니다.
스택과 문자열로 문제를 풀었습니다. 순서는 다음과 같습니다.
1. <> 태그에 감싸져 있는 요소들을 구한다.
2. 요소들을 " "로 split 합니다.
2. 갯수가 2개 밖에 없고 마지막이 / 이면 알아서 끝내는 속성이므로 stack에 넣지 않습니다.
3. 첫 번째가 /로 시작하지 않다면 시작하는 태그이므로 stack에 넣습니다.
4. 첫 번째가 /로 시작한다면 끝내는 태그이므로 stack.peek()를 통해 최신과 비교합니다. 일치한다면 stack.pop()을 통해 제거하고 계속해서 탐색을 이어갑니다. 만약 일치하지 않다면 틀린 형식이므로 illegal 입니다.
6. 만일 stack이 비어있다면 틀 형식이므로 illegal입니다.
7. 태그의 탐색을 끝냈을 때 stack이 비어있다면 legal, stack에 무언가 남아있다면 illegal입니다.
위의 로직을 코드로 구현하여 문제를 풀었습니다.
소스 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/*
web page
https://www.acmicpc.net/problem/5076
태그로 감싸져 있는 것들 먼저 분리
태그의 속성이 두 개밖에 없고 마지막이 / 이면 stack에 넣지 않는다.
태그의 첫 번째 속성을 stack에 넣는다.
태그의 첫 번째 속성이 /로 시작한다면 stack 맨 위에 거랑 비교한다.
깉은 거면 스택에서 제거하고 계속 진행한다.
같지 않다면 illegal을 출력한다.
*/
public class Main {
static StringBuilder sb;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = "";
sb = new StringBuilder();
while(true) {
str = br.readLine();
if(str.equals("#")) {
break;
}
solve(str);
}
System.out.println(sb);
}
public static void solve(String str) {
StringBuilder one = new StringBuilder();
List<String> tags = new ArrayList<>();
boolean flag = false;
for(int i = 0; i < str.length(); i++) {
if(str.charAt(i) == '>') {
flag = false;
tags.add(one.toString());
}
if(flag == true) {
one.append(str.charAt(i));
}
if(str.charAt(i) == '<') {
flag = true;
one = new StringBuilder();
}
}
Stack<String> stack = new Stack<>();
for(String tag : tags) {
if(checkSelfEnd(tag)) continue;
if(checkStart(tag)) {
String[] strArr = tag.split(" ");
stack.add(strArr[0]);
}
if(!checkStart(tag)) {
String substring = tag.substring(1);
if(stack.isEmpty()) {
sb.append("illegal\n");
return;
}
if(stack.peek().equals(substring)) {
stack.pop();
}
else {
sb.append("illegal\n");
return;
}
}
}
if(stack.isEmpty()) {
sb.append("legal\n");
}
else {
sb.append("illegal\n");
}
}
public static boolean checkSelfEnd(String tag) {
String[] s = tag.split(" ");
if(s.length == 2 && s[1].equals("/")) {
return true;
}
return false;
}
public static boolean checkStart(String tag) {
if(tag.charAt(0) == '/') {
return false;
}
return true;
}
}

문제 출저
https://www.acmicpc.net/problem/5076
5076번: Web Pages
Input will consist of a number of lines of HTML code, each line containing from 0 to 255 characters. The last line will contain a single # character – do not process this line. Within the text of each line will be zero or more tags. No angle bracket will
www.acmicpc.net
문제 풀이
String이 #이 나올 때까지 주어집니다.
String이 HTML 태그 형식에 맞는지 확인해서 옳다면 legal, 틀리면 illegal을 출력해야 하는 문제 입니다.
스택과 문자열로 문제를 풀었습니다. 순서는 다음과 같습니다.
1. <> 태그에 감싸져 있는 요소들을 구한다.
2. 요소들을 " "로 split 합니다.
2. 갯수가 2개 밖에 없고 마지막이 / 이면 알아서 끝내는 속성이므로 stack에 넣지 않습니다.
3. 첫 번째가 /로 시작하지 않다면 시작하는 태그이므로 stack에 넣습니다.
4. 첫 번째가 /로 시작한다면 끝내는 태그이므로 stack.peek()를 통해 최신과 비교합니다. 일치한다면 stack.pop()을 통해 제거하고 계속해서 탐색을 이어갑니다. 만약 일치하지 않다면 틀린 형식이므로 illegal 입니다.
6. 만일 stack이 비어있다면 틀 형식이므로 illegal입니다.
7. 태그의 탐색을 끝냈을 때 stack이 비어있다면 legal, stack에 무언가 남아있다면 illegal입니다.
위의 로직을 코드로 구현하여 문제를 풀었습니다.
소스 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/*
web page
https://www.acmicpc.net/problem/5076
태그로 감싸져 있는 것들 먼저 분리
태그의 속성이 두 개밖에 없고 마지막이 / 이면 stack에 넣지 않는다.
태그의 첫 번째 속성을 stack에 넣는다.
태그의 첫 번째 속성이 /로 시작한다면 stack 맨 위에 거랑 비교한다.
깉은 거면 스택에서 제거하고 계속 진행한다.
같지 않다면 illegal을 출력한다.
*/
public class Main {
static StringBuilder sb;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = "";
sb = new StringBuilder();
while(true) {
str = br.readLine();
if(str.equals("#")) {
break;
}
solve(str);
}
System.out.println(sb);
}
public static void solve(String str) {
StringBuilder one = new StringBuilder();
List<String> tags = new ArrayList<>();
boolean flag = false;
for(int i = 0; i < str.length(); i++) {
if(str.charAt(i) == '>') {
flag = false;
tags.add(one.toString());
}
if(flag == true) {
one.append(str.charAt(i));
}
if(str.charAt(i) == '<') {
flag = true;
one = new StringBuilder();
}
}
Stack<String> stack = new Stack<>();
for(String tag : tags) {
if(checkSelfEnd(tag)) continue;
if(checkStart(tag)) {
String[] strArr = tag.split(" ");
stack.add(strArr[0]);
}
if(!checkStart(tag)) {
String substring = tag.substring(1);
if(stack.isEmpty()) {
sb.append("illegal\n");
return;
}
if(stack.peek().equals(substring)) {
stack.pop();
}
else {
sb.append("illegal\n");
return;
}
}
}
if(stack.isEmpty()) {
sb.append("legal\n");
}
else {
sb.append("illegal\n");
}
}
public static boolean checkSelfEnd(String tag) {
String[] s = tag.split(" ");
if(s.length == 2 && s[1].equals("/")) {
return true;
}
return false;
}
public static boolean checkStart(String tag) {
if(tag.charAt(0) == '/') {
return false;
}
return true;
}
}