[백준/BOJ] 백준 5076번 : Web Pages

2021. 11. 20. 16:16알고리즘 문제풀이

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

괄호를 찾아서 여는 괄호일 때 스택에 넣고, 닫는 괄호일 때 스택의 top을 확인하는 방법으로 문제를 해결했다.

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <stack>
using namespace std;

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	while (1)
	{
		string input;
		getline(cin, input);

		if (input == "#")
			break;

		stack<string> st;
		int index = 0;
		bool check = true;
		while (1)
		{
			if (index >= input.size())
				break;
			if (input.find("<", index) == string::npos)
				break;

			int left_index = input.find("<", index);
			int right_index = input.find(">", left_index + 1);

			string this_word = input.substr(left_index + 1, right_index - (left_index + 1));

			//a 여는 기호일 경우
			if (this_word.size() >= 2 && this_word[0] == 'a' && this_word[1] == ' ')
				this_word = "a";

			//<br />일 경우
			else if (this_word[this_word.size() - 1] == '/')
			{
				index = right_index + 1;
				continue;
			}

			//닫는 괄호일때
			if (this_word[0] == '/')
			{
				this_word = this_word.substr(1);

				//최근 연 괄호와 같을때
				if (st.size() >= 1 && st.top() == this_word)
				{
					st.pop();
					index = right_index + 1;
				}

				//최근 연 괄호랑 다를때
				else
				{
					check = false;
					break;
				}
			}

			//여는 괄호일때
			else
			{
				st.push(this_word);
				index = right_index + 1;
			}
		}

		if (st.size() != 0)
			check = false;

		if (check == true)
			cout << "legal" << "\n";
		else
			cout << "illegal" << "\n";
	}

	return 0;
}