๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿƒ algorithm/boj

BOJ 5076 - Web Pages

by HandHand 2021. 7. 19.

๋ฌธ์ œ

๋ฐฑ์ค€ ์˜จ๋ผ์ธ ์ €์ง€ - 5076๋ฒˆ

ํ’€์ด ๊ณผ์ •

HTML ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„์„œ ํ•ด๋‹น ๋ฌธ์ž์—ด์ด ์œ ํšจํ•œ์ง€ ํŒ๋‹จํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
์—ด๋ฆฐ ํƒœ๊ทธ์™€ ๋‹ซํžŒ ํƒœ๊ทธ๋Š” ์„œ๋กœ ์Œ์„ ์ด๋ฃจ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— (self-closing ํƒœ๊ทธ ์ œ์™ธ) ์Šคํƒ ์„ ์ด์šฉํ•ด์„œ ์œ ํšจ์„ฑ์„ ํŒ๋‹จํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
์ด๋•Œ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์—์„œ ํƒœ๊ทธ๋ฅผ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์‹ฑํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
ํƒœ๊ทธ ์ •๋ณด๋Š” ํƒœ๊ทธ ์ด๋ฆ„, ํƒœ๊ทธ ํƒ€์ž… ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ


import sys


def parse_tag(html):
    parsed_tags = []
    start_parsing = False
    tag_name = ''
    tag_type = ''

    for idx in range(len(html)):
        if html[idx] == '<':
            tag_type = 'open' if html[idx + 1] != '/' else 'close'
            start_parsing = True
        elif html[idx] == '>':
            tag_type = 'self-closing' if html[idx - 1] == '/' else tag_type
            parsed_tags.append({'tag_type': tag_type, 'tag_name': tag_name })
            tag_type = ''
            tag_name = ''
            start_parsing = False
        else:
            if start_parsing and html[idx] != ' ':
                if html[idx] != '/':
                    tag_name += html[idx]
            else:
                start_parsing = False

    return parsed_tags


def solution(html):
    tag_stack = []
    tags = parse_tag(html)

    for tag in tags:
        if tag['tag_type'] == 'self-closing':
            continue
        elif tag['tag_type'] == 'close':
            if not tag_stack:
                return 'illegal'

            top_tag = tag_stack[-1]
            if top_tag['tag_type'] != 'open' or top_tag['tag_name'] != tag['tag_name']:
                return 'illegal'

            tag_stack.pop()
        else:
            tag_stack.append(tag)

    return 'legal' if not tag_stack else 'illegal'


if __name__ == '__main__':
    while True:
        question = sys.stdin.readline().strip()

        if question == '#':
            break

        answer = solution(question)
        print(answer)
๋ฐ˜์‘ํ˜•

๐Ÿ’ฌ ๋Œ“๊ธ€