4949 균형잡힌 세상

DONGJIN IM·2022년 6월 28일
0

코딩 테스트

목록 보기
114/137

문제 이해

조건은 아래와 같다.
1. 왼쪽 소괄호('(')는 오른쪽 소괄호(')')와 짝을 맺는다
2. 왼쪽 대괄호('[')는 오른쪽 대괄호(']')와 짝을 맺는다.
3. 괄호 하나는 한 개의 반대 괄호와만 짝을 맺는다.
4. 왼쪽 괄호가 나왔다면 반드시 오른쪽 괄호도 나와야 한다.

이런 문자열일 경우 yes를, 아닐 경우 No를 출력한다.


문제 이해

딱 봐도 Stack을 사용하면 빨리 풀 수 있는 문제라고 생각했다.

왼쪽 괄호가 나오면 Stack에 넣고, 오른쪽 괄호가 나오면 Stack의 가장 상단에 존재하는 값을 pop하여 매칭되는 왼쪽 괄호인지 확인하면 될 것 같았다.

즉, stack에 (가 출력된다면 오른쪽 괄호는 )이여지만 균형잡힌 문자열인 것이다


문제 풀이

import re

while True :
    N = input()
    stack = []

    if N == "." :
        break
    # while문 종료 조건

    N = re.sub('[a-zA-Z \\.]', '',N).strip()
    # a~z, A~Z, '.'을 문자열에서 제거(균형잡힌 문자열에서 확인할 필요가 없음)

    for i in N :
        if i == '[' or i == '(' :
            stack.append(i)
        elif i == ']' :
            if len(stack) != 0 and stack[-1] == '[' :
                stack.pop() 
                # 맞으면 지워서 stack을 비워줌 0 = yes
            else :
                stack.append(']')
                break
        elif i == ')' :
            if len(stack) != 0 and stack[-1] == '(' :
                stack.pop()
            else :
                stack.append(')')
                break
    # stack이 비었기 때문에(좌측 괄호가 존재하지 않았기 때문에)
    # 균형잡힌 문자열이 안 될 수도 있다.
    # 따라서, stack.append('아무 문자열') 명령어를 추가해준다.
    # 이렇게 하면 stack이 비었을 경우 균형잡힌 문자열, 비지 않았다며
    # 균형잡히지 않은 문자열이라고 판단 가능하다
    
    if len(stack) == 0 :
        print('yes')
    else :
        print('no')

결과

  • 틀렸습니다 : 위에서 주석으로 5문장 정도 설명한 내용이 존재한다.
    Stack이 비어서 break문이 실행되었을 경우, stack이 비었지만 왼쪽 괄호가 없고 오른쪽 괄호만 나왔기 때문에 균형잡히지 않은 문자열이다.
    하지만, Stack 자체는 비었기 때문에 len(stack)=0이 되어 균형잡혔다고 착각하는 현상이 발생한다.
    따라서, stack.append('아무 문자열')로써 break이전에 stack에 쓰레기 값을 채워줘야 한다
profile
개념부터 확실히!

0개의 댓글

관련 채용 정보