1️⃣ 서론
이 문제는 백준 괄호의 값 문제에 대한 풀이이며 파이썬(Python)
으로 해결하였다.
2️⃣ 문제 설명
’[’, ‘]’, ‘(‘, ‘)’ 로 이루어진 문자열이 있다. 괄호의 값을 계산하는 식은 다음과 같다.
- ’()’ 인 괄호열의 값은 2이다.
- ’[]’ 인 괄호열의 값은 3이다.
- ‘(X)’ 의 괄호값은 2×값(X) 으로 계산된다.
- ‘[X]’ 의 괄호값은 3×값(X) 으로 계산된다.
- 올바른 괄호열 X와 Y가 결합된 XY의 괄호값은 값(XY)= 값(X)+값(Y) 로 계산된다.
괄호열에 대한 값을 출력하는 문제이다. 단 올바른 괄호 식이 아니면 0을 출력한다.
3️⃣ 풀이
이전에 괄호검사는 스택으로 하는 문제를 풀었어서 검사는 쉽게 접근할 수 있었지만 계산을 어떻게 접근해야할지 막막했다.
그러다가 중간 계산 값도 스택에 넣으면 어떨까 하는 생각이 들었고 다행히 이 방법이 잘 맞아서 해결할 수 있었다. 계산 방식은 다음과 같다.
닫힌 괄호가 나오면 그와 일치하는 열린괄호가 나올때까지 스택을 pop한다. 이때 tmp라는 변수로 숫자를 만나면 더해주게 된다. 열린괄호를 만났을 때 tmp가 0이면 그 이전에 숫자가 없었다 즉, 내부에 괄호가 없었다는 뜻이므로 그냥 더해주고 숫자가 있었다면 내부에 괄호가 있었다는 뜻이므로 곱해준다.
이와 같은 방식으로 계속 스택을 검사하며 문제를 해결할 수 있었다. 코드를 보도록 하자.
4️⃣ 코드
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import sys
s = input()
stack = []
answer = 0
for x in s:
if x == ')':
tmp = 0
if len(stack) == 0:
print(0)
sys.exit(0)
while len(stack) != 0:
top = stack.pop()
if top == '[':
print(0)
sys.exit(0)
elif top == '(':
if tmp == 0:
stack.append(2)
else:
stack.append(tmp * 2)
break
else:
tmp += top
elif x == ']':
tmp = 0
if len(stack) == 0:
print(0)
sys.exit(0)
while len(stack) != 0:
top = stack.pop()
if top == '(':
print(0)
sys.exit(0)
elif top == '[':
if tmp == 0:
stack.append(3)
else:
stack.append(tmp * 3)
break
else:
tmp += top
elif x == '(' or x == '[':
stack.append(x)
else:
print(0)
sys.exit(0)
# print(stack)
for i in stack:
if i == '(' or i == '[':
print(0)
sys.exit(0)
else:
answer += i
print(answer)
5️⃣ 마치며
괄호 검사 문제는 흔해서 쉽게 풀 수 있다고 생각했는데 괄호 검사에 계산까지 더해져서 아이디어를 생각해 내는 것이 좀 까다로웠던 문제였던 것 같다.