[BOJ/Python] 4949 : 균형잡힌 세상

정나영·2023년 11월 13일
0

👉 문제 링크

👉 첫번째 시도 (❌틀린코드❌)

while True:
    s = input()
    stk = []

    cnt1, cnt2 = 0,0

    if s == '.':
        break

    for i in s:
        if i == '[':
            cnt1 += 1

        elif i == '(':
            cnt2 += 1

        elif i == ']':
            cnt1 -= 1
        
        elif i == ')':
            cnt2 -= 1

        if cnt1 < 0 or cnt2 < 0:
            break 
    
    if cnt1 == 0 and cnt2 == 0:
        print('yes')
    else:
        print('no')

[, ], (, ) 의 횟수를 각각 세는 방법을 처음 시도했다.

이 방법이 틀린 이유는,
"짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다."
이 조건 때문이다.

예를 들어,
[ 안녕하세요. ) ]
이 문장은 대괄호 사이 문자열이 균형 잡혔다고 할 수 없다.

위 코드는 이 조건을 무시하는 코드였다.
닫히기만 하면 되는 줄 알았지만 가장 최근에 열린 괄호부터 닫혀야 한다 !

👉 두번째 시도

while True:
    s = input()

    stk = []

    if s == '.':
        break

    for i in s:
        if i == '[' or i == '(':
            stk.append(i)
        
        elif i == ']':
            if len(stk) != 0 and stk[-1] == '[':
                stk.pop()
            else:
                stk.append(i)
                break
        
        elif i == ')':
            if len(stk) != 0 and stk[-1] == '(':
                stk.pop()
            else:
                stk.append(i)
                break
    
    if len(stk) == 0:
        print('yes')
    else:
        print('no')

두번째로 생각했던 방법은
스택에 열린 괄호를 넣고 마지막에 들어온 괄호와 닫힌 괄호와 짝을 이루는지 확인하는 방법이다.
괄호가 짝을 이루면 스택에서 제거, 아닌 경우에는 닫힌 괄호를 스택에 넣는다.

0개의 댓글

관련 채용 정보