괄호의 값(백준 2504번)
문제
4개의 기호 ‘(
’, ‘)
’, ‘[
’, ‘]
’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다.
- 한 쌍의 괄호로만 이루어진 ‘
()
’와 ‘[]
’는 올바른 괄호열이다. - 만일
X
가 올바른 괄호열이면 ‘(X)
’이나 ‘[X]
’도 모두 올바른 괄호열이 된다. X
와Y
모두 올바른 괄호열이라면 이들을 결합한XY
도 올바른 괄호열이 된다.
예를 들어 ‘(()[[]])
’나 ‘(())[][]
’ 는 올바른 괄호열이지만 ‘([)]
’ 나 ‘(()()[]
’ 은 모두 올바른 괄호열이 아니다. 우리는 어떤 올바른 괄호열 X
에 대하여 그 괄호열의 값(괄호값)을 아래와 같이 정의하고 값(X
)로 표시한다.
- ‘
()
’ 인 괄호열의 값은 2이다. - ‘
[]
’ 인 괄호열의 값은 3이다. - ‘
(X)
’ 의 괄호값은 2×값(X
) 으로 계산된다. - ‘
[X]
’ 의 괄호값은 3×값(X
) 으로 계산된다. - 올바른 괄호열
X
와Y
가 결합된XY
의 괄호값은 값(XY
)= 값(X
)+값(Y
) 로 계산된다.
예를 들어 ‘(()[[]])([])
’ 의 괄호값을 구해보자. ‘()[[]]
’ 의 괄호값이 2 + 3×3=11 이므로 ‘(()[[]])
’의 괄호값은 2×11=22 이다. 그리고 ‘([])
’의 값은 2×3=6 이므로 전체 괄호열의 값은 22 + 6 = 28 이다.
여러분이 풀어야 할 문제는 주어진 괄호열을 읽고 그 괄호값을 앞에서 정의한대로 계산하여 출력하는 것이다.
나의 풀이(풀이 참고)
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
my_list=input()
stack=[]
cal=1
answer=0
for i in range(len(my_list)):
if my_list[i]=='(':
stack.append('(')
cal*=2
elif my_list[i]=='[':
stack.append('[')
cal*=3
elif my_list[i]==')':
if '(' not in stack or stack[-1]=='[':
answer=0
break
elif my_list[i-1]=='(':
answer+=cal
stack.pop()
cal//=2
elif my_list[i]==']':
if '[' not in stack or stack[-1]=='(':
answer=0
break
elif my_list[i-1]=='[':
answer+=cal
stack.pop()
cal//=3
if stack:
print(0)
else:
print(answer)
- 혼자 힘으로 못 풀었다.
(()[[]])([])
이 괄호식의 경우 숫자로 바꿔보면 아래와 같다.2*(2+3*3)+3*3
- 위 식을 분배법칙을 사용해서 풀어써보면,
2*2+2*3*3+3*3
이다. - 즉, 괄호가 열리면, 그 괄호에 해당하는 숫자를 곱하고, 닫히는 순간에 직전 값이 같은 괄호이면, 그 값을 더해주면 되는 것이다.
- 흠.. 사실 머리로는 이해가 되었는데, 어떻게 설명을 해야 할지 잘 모르겠다.
- 나중에 이 문제를 잊었을 때 쯤 다시 한번 풀어봐야겠다.
This post is licensed under CC BY 4.0 by the author.