본문 바로가기
  • 비둘기다
  • 비둘기다
  • 비둘기다
코딩테스트/baekjoon

[스택] 백준 2504번 (파이썬) : 괄호의 값

by parzival56 2023. 5. 19.

문제를 요약하자면 소괄호와 대괄호에 따라 연산을 다르게 처리한다는 것이다.

코드로 구현하면 다음과 같다.

b = list(input())

s = []
answer = 0
num = 1

for i in range(len(b)):

    if b[i] == "(":
        s.append(b[i])
        num *= 2

    elif b[i] == "[":
        s.append(b[i])
        num *= 3

    elif b[i] == ")":
        if not s or s[-1] == "[":
            answer = 0
            break
        if b[i-1] == "(":
            answer += num
        s.pop()
        num //= 2

    else:
        if not s or s[-1] == "(":
            answer = 0
            break
        if b[i-1] == "[":
            answer += num

        s.pop()
        num //= 3

if s:
    print(0)
else:
    print(answer)

일단 입력으로 받아줄 괄호 덩어리들을 리스트로 저장해 주고 밑의 과정을 통해 이들을 하나씩 스택에 저장한다.

일단 for문을 리스트의 길이만큼 반복하고, num은 현재 점수로 소괄호가 나오면 2를 곱하고 대괄호가 나오면 3을 곱해줍니다. 

 

먼저 소괄호가 나오면 일단 이를 스택으로 push하고push 하고 2를 곱해줍니다. 그리고 대괄호가 나오면 마찬가지로 push 하고 3을 곱해줍니다.

문제는 닫는 괄호가 나오는 경우인데 닫는 괄호가 나오는 경우에는 바로 앞의 인덱스를 보고 서로 같은 종류의 괄호인지 아닌지를 확인해야 합니다. 만약 닫는 소괄호가 나왔는데 바로 앞은 여는 대괄호이면 거짓인 문자열이기 때문입니다.

 

그래서 일단 소괄호든 대괄호든 닫는 괄호가 나오면 일단 닫는 괄호가 올바른 위치에 왔는지를 검사하고 만약 올바르지 않다면 바로 break를 해줍니다.

올바르게 왔다면 하나의 괄호쌍을 지워줘야하기 때문에 지금까지의 num을 최종 정답에 넣어주고, pop을 하여 가장 최근의 괄호를 삭제시킵니다.

 

그리고 소괄호쌍이 닫히면 //2를 대괄호쌍이 닫히면 //3을 하는 이유는 이를 해야 대괄호가 나오기 전의 점수로 되돌아가기 때문입니다.

 

댓글