문제

[BaekJoon] 2504 괄호의 값

’()’ 괄호열의 값은 2

’[]’ 괄호열의 값은 3

‘(x)’ 괄호값은 2 x 값(x)

‘[x]’ 괄호값은 3 x 값(x)

올바른 괄호열 X와 Y가 결합된 XY의 괄호값은 X + Y

문제는 빨리 이해했지만 보자마자 이해한 건 아니기 때문에 잠시 예시를 들어 간단 설명하자면

IMG_0204

이런 식이다.

풀이

괄호를 입력받고, 괄호의 종류에 따라 케이스를 둘 것이다. ‘(‘ ‘)’ ‘[’ ‘]’

( or [ - 열린 괄호가 들어올 경우 2 or 3을 곱해주고 이후 올바른 괄호 판단 알고리즘대로 stack에 append 해줄 것이다.

) or ] - 닫힌 괄호가 들어올 경우 stack이 비어 있는지, stack[-1]이 올바른 괄호 짝이 맞는지 체크한다. 짝이 맞지 않을 경우 result = 0으로 초기화하고 break. 짝이 맞다면 2 or 3을 나눠주고 stack에서 pop 한다.

만약 닫힌 괄호가 들어오기 전에 짝이 맞는 열린 괄호가 들어 왔다면 그 두 괄호는 올바른 짝이고 가장 안 쪽에 있으므로 괄호의 한 케이스가 끝난 것이다. 그렇기 때문에 result에 값을 더해주면 된다.

Code

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
31
32
33
34
35
36
37
38
39
import sys
input = sys.stdin.readline

list = input().strip()

stack = []
result = 0
n = 1

for i in range(len(list)):
    
    if list[i] == "(":
        n *= 2
        stack.append(list[i])
    elif list[i] == "[":
        n *= 3
        stack.append(list[i])
    elif list[i] == ")":
        if not stack or stack[-1] != "(":
            result = 0
            break
        if list[i-1] == "(":
            result += n
        n //= 2
        stack.pop()
    elif list[i] == "]":
        if not stack or stack[-1] != "[":
            result = 0
            break
        if list[i-1] == "[":
            result += n
        
        stack.pop()
        n //= 3

if stack:
    print(0)
else:
    print(result)

Leave a comment