문제

https://www.acmicpc.net/problem/4949

걸린 시간

00 : 45 : 30

풀이

Python3

class Stack:
    def __init__(self):
        self.stack = []

    def is_empty(self):
        return len(self.stack) == 0

    def push(self, data):
        self.stack.append(data)

    def pop(self):
        if self.is_empty():
            return -1
        else:
             return self.stack.pop()
    def peek(self):
        if self.is_empty():
            return -1
        else:
             return self.stack[-1]

def switch(i):
    return {'(': '1', '[': '1', ']': '2', ')': '2'}.get(i, '-1')

def match_bracket(i):
    return {')': '(', ']': '['}.get(i, '-1')

def Match(expr):
    s = Stack()

    # 문자열을 하나씩 분리한다.
    for i in expr:
        ch = switch(i)
        # 왼쪽 괄호이면
        if ch == '1':
            # 스택에 추가
            s.push(i)
        # 오른쪽 괄호이면
        elif ch == '2':
            op = s.pop()
            # 스택에 있는 값과 비교
            if op == match_bracket(i):
                # 같을 경우
                pass
            else:
                # 다를 경우
                return False
        # 괄호가 아닌 문자이면            
        else:
            pass

    if s.is_empty():
        return True
    else:
         return False

if __name__ == "__main__":
    # 문자열을 저장할 리스트 선언.
    arr = []

    while True:
        # 종료조건인 '.' 를 구분자로 입력받는다.
        temp = input().split('.')[0]

        # 점 하나만 입력되었을 경우 입력을 종료한다.
        if temp == '':
            break

        # 문자열 리스트에 저장.
        arr.append(temp)

    # 입력받은 문장을 하나씩 분리하여 괄호를 스택에 추가한다.
    for i in arr:
        if Match(i):
            print("yes")
        else:
             print("no")

입력을 어떻게 받아야 할지가 더 고민되었던 문제이다.

'Baekjoon' 카테고리의 다른 글

Baekjoon 2941번 크로아티아 알파벳  (0) 2020.07.21
Baekjoon 1316번 그룹 단어 체커  (0) 2020.07.21
Baekjoon 11866번 요세푸스 문제 0  (0) 2020.07.21
Baekjoon 1966번 프린터 큐  (0) 2020.07.20
Baekjoon 1874번 스택 수열  (0) 2020.07.20

댓글