[Python] 백준 4949번: 균형잡힌 세상

민정·2023년 3월 24일

백준 풀이

목록 보기
7/17

풀이 전략은 다음과 같습니다.

( 가 있다면 다음 괄호는 ) ,
[ 가 있다면 다음 괄호는 ] 가 되겠죠?

괄호 문제는 스택을 활용하는 대표적인 유형이므로, list를 활용하여 스택을 구현해보겠습니다.

  1. 입력의 종료 조건이 "온점 하나"라고 되어있네요.
    종료 조건이 명시된 문제라면 while True를 사용하여 반복하고, 종료 조건을 만나면 break로 빠져나오는 코드로 작성하면 됩니다.

  2. 균형잡힌 문자열에는 괄호가 아무것도 없는 문자열과 빈 문자열이 포함됩니다.
    따라서 flag는 yes로 초기화하고, 스택에는 괄호만 저장하여 flag를 no로 바꿀지 여부를 결정해주면 되겠습니다.

  3. 그렇다면 스택은 어떻게 활용하면 좋을까요?
    일단, 여는 괄호는 스택에 모두 push하여 저장합니다.
    닫는 괄호를 만났을 때 경우가 나눠지는데요!
    예시로 [ ( ( [ ( ) ] ) ) ] 를 생각해보겠습니다.
    중간을 딱 자르면 오른쪽과 왼쪽이 대칭을 이루네요.
    스택을 사용한다면 여는 괄호를 스택에 저장하고,
    닫는 괄호가 스택의 top과 쌍을 이루는지 확인해주면 됩니다.

코드를 보겠습니다.

ans = ""
while True:
    sen = input()
    if sen == '.': # 종료 조건
        break

    flag = "yes" # yes로 초기화
    stack = [] # 괄호만 저장하는 스택

    for s in sen:
        if s == '(' or s == '[': # 여는 괄호면 스택에 push
            stack.append(s)
        elif s == ')':
            if len(stack) == 0: # 빈 스택이면 no
                flag = "no"
                break
            else:  # 스택의 top이 ( 가 아니면 no
                if stack.pop() == '(':
                    pass
                else:
                    flag = "no"
                    break
        elif s == ']':
            if len(stack) == 0: # 빈 스택이면 no
                flag = "no"
                break
            else: # 스택의 top이 [ 가 아니면 no
                if stack.pop() == '[':
                    pass
                else: 
                    flag = "no"
                    break
        else: # 괄호가 아니면 pass
            pass
            
    if len(stack) != 0: # 스택에 괄호가 남아있으면
        flag = 'no'
        
    ans += flag + '\n'

print(ans)

스택을 활용하면 문자열이 대칭인지 여부를 쉽게 확인할 수 있습니다.
괄호가 아무것도 없는 문자열과 빈 문자열을 놓치지 않는 것이 중요한 문제였던 것으로 보입니다.
flag를 yes로 초기화하고, 괄호를 다루며 flag를 no로 바꿀지 여부를 결정하는 로직을 사용한다면 쉽게 풀 수 있습니다.

0개의 댓글