Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

자르비 왕국

[백준] 2504 괄호의 값 - Python 본문

문제풀이

[백준] 2504 괄호의 값 - Python

자르비옹스 2022. 1. 26. 00:42

https://www.acmicpc.net/problem/2504

 

2504번: 괄호의 값

4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다.  만일

www.acmicpc.net

몇달 전에 풀어본 문제였지만, 역시나 풀어봤던 기억만 날 뿐 풀이는 기억나지 않았다. stack을 이용하여 푼다는 것은 알고 있었지만, 값을 계산하는 데에서 시간이 오래 걸렸다.

다른 블로그의 글과는 달리 코드가 길어졌지만, 93%에서 틀리고 스스로 반례를 찾아서 문제를 해결한 것에 의의를 두도록 한다.

 

풀이

from collections import deque

q = list(input())
deq = deque()

answer = 0
status = True
for i in range(len(q)) :
    # 열린 괄호의 경우 무조건 push
    if q[i] == '(' or q[i] == '[' :
        deq.append(q[i])
        continue
    
    if not deq :
        answer = -1
        break
    
    # stack이 비어있지 않은 상태에서 닫는 괄호가 들어왔을 때
    if q[i] == ')' :
        temp = 0
        while deq  :
            idx = len(deq)-1
            if deq[idx] == '[' :
                # 비정상
                answer=-1
                status = False
                break
            elif deq[idx] == '(' :
                deq.pop()
                break
            # 숫자라면
            if len(deq) < 2:
                # 비정상 (deq에 숫자만 남은 경우)
                answer=-1
                status = False
                break
            temp += deq[idx]
            deq.pop()
        deq.append(2 if temp == 0 else 2*temp)
    elif q[i] == ']' :
        temp = 0
        while deq :
            idx = len(deq)-1
            if deq[idx] == '(' :
                # 비정상
                answer=-1
                status = False
                break
            elif deq[idx] == '[' :
                deq.pop()
                break
            # 숫자라면
            if len(deq) < 2:
                # 비정상 (deq에 숫자만 남은 경우)
                answer=-1
                status = False
                break
            temp += deq[idx]
            deq.pop()
        deq.append(3 if temp == 0 else 3*temp)
    if not status :
        break
    
if answer == -1 :
    print(0)
else :
    while deq : 
        if deq[-1] == '(' or deq[-1] == '[' or deq[-1] == ')' or deq[-1] == ']' :
            answer = 0
            break
        answer += deq.pop()
    print(answer)

다른 사람들의 풀이

from collections import deque

q = list(input())
deq = deque()

answer = 0
temp = 1
status = True

for i in range(len(q)) :
    if q[i] == '(' :
        deq.append(q[i])
        temp *= 2
    elif q[i] == '[' :
        deq.append(q[i])
        temp *= 3
    # 불가능한 경우
    elif q[i] == ')' and (not deq or deq[-1] == '[') :
        answer = 0
        status = False
        break
    elif q[i] == ']' and (not deq or deq[-1] == '(') :
        answer = 0
        status = False
        break
    # 가능한 경우
    elif q[i] == ')' :
        if q[i-1] == '(' :
            answer += temp
        deq.pop()
        temp //= 2
    elif q[i] == ']' :
        if q[i-1] == '[' :
            answer += temp
        deq.pop()
        temp //= 3
    
if not status or deq :
    print(0)
else :
    print(answer)

해당 코드를 살펴보니, 분배법칙을 이용하였다. 괄호 특성상 2*(2+3*3) = 2*2+2*3*3으로 표현될 수 있는데, temp가 해당 분배법칙의 항을 나타내는 것이고, answer는 괄호가 닫힐 때 input값의 이전 괄호와 비교했을 때 내부에 다른 괄호가 없는지 확인한 뒤 result에 더하는 것이다.

즉, 계속 temp에 분배법칙을 적용하여 계산한 뒤, 마지막 내부의 괄호의 경우에 result에 더해준다.

'문제풀이' 카테고리의 다른 글

[백준] 1062 가르침 - JAVA  (0) 2022.02.02
[백준] 14719 빗물 - Java  (0) 2022.01.29
[백준] 2581 소수 - Python  (0) 2022.01.18
[백준] 1292 쉽게 푸는 문제 - Python  (0) 2022.01.18
[백준] 1978 소수 찾기 - Python  (0) 2022.01.18