[백준]4949번 균형잡힌 세상 - 스택
SW개발/코딩테스트

[백준]4949번 균형잡힌 세상 - 스택

 

def vps(p):
    stack = []
    check = True
    for i in p:
        if i == "(" or i == "[":
            stack.append(i)
        elif i == ")" or i == "]":
            if i == ")":
                if not stack or stack[-1] == "[" :  # ")", "]" 로 먼저 시작되는 경우 no
                    check = False
                    break
                else:
                    stack.pop()
            elif i == "]":
                if not stack or stack[-1] == "(":
                    check = False
                    break
                else:
                    stack.pop()
    if not stack and check == True:
        print("yes")
    else:
        print("no")
while True:
    p = input()
    if (p == '.'):
        break
    vps(p)

 

코드설명

기본적인 방식은 이전의 9012번 문제 풀이와 유사하다. 하지만 여러 가지 경우의 수를 체크해 주어야 한다.

먼저, 반복문을 돌면서 입력되는 값이 일 경우 반복문을 탈출한다.

vps 함수에서는 문장을 탐색하면서 값이 "(" 나 "[" 로 시작하는 경우에는 스택에 삽입하여준다.

그렇지 않고 ")", "]" 와 같은 경우일 때는 2가지 경우로 나누어 생각한다.

1) ")" 이 오는 경우 - 스택에 값이 존재하지 않음 혹은 "["로 시작되어 있는 경우 ")" 로 닫힐 수 없으므로 check = False 로 할당

2) "]" 이 오는 경우 - 스택에 값이 존재하지 않음 혹은 "("로 시작되어 있는 경우 "]" 로 닫힐 수 없으므로 check = False 로 할당

위의 경우가 아니라면 정상적인 경우이므로 스택에서 값을 지워준다.

마지막으로, 스택에 값이 없고 check = True 인 경우에만 "yes" 를 출력하고 그 외엔 "no" 를 출력한다.

 

Point : 이전 문제와 유사하지만 대괄호가 추가되면서 체크해야 할 조건이 늘어났다.

예를 들어 "[" 가 온 경우 ")"가 닫힐 수 없고, "("가 온 경우 "]"가 닫힐 수 없는 경우와 같다.

위와 같은 조건들에서는 체크 항목을 False 로 할당 후 "no"를 출력하면 된다.

728x90

'SW개발 > 코딩테스트' 카테고리의 다른 글

[백준]18258번 큐 2 - 큐  (0) 2021.01.15
[백준]1874번 스택 수열 - 스택  (0) 2021.01.14
[백준]9012번 괄호 - 스택  (0) 2021.01.12
[백준]10773번 제로 - 스택  (0) 2021.01.11
[백준]10828번 스택 - 스택  (0) 2021.01.02