출처
https://www.acmicpc.net/problem/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 이상, 30 이하이다.
출력
첫째 줄에 그 괄호열의 값을 나타내는 정수를 출력한다. 만일 입력이 올바르지 못한 괄호열이면 반드시 0을 출력해야 한다.
예제 입력
(()[[]])([])
예제 출력
28
해석
주어진 입력 값에 띄어쓰기가 없는 것을 명심해서 리스트(li)를 만들도록 한다. 이후에, 리스트의 값들을 하나씩 확인한다. stack 형식으로 문제를 풀기 위해서, 만약 값이 '('
, '['
이라면 새로운 리스트(ba)에 저장을 해둔다. 그리고 ')'
혹은 ']'
이 나올때에는 ba에서 최근에 저장한 값이랑 비교를 하여 짝이 맞는지 확인을 하도록 한다.
이제, 숫자 곱들을 생각해보자. li의 값이 연속하여 '(', ')'
혹은 '[',']'
이라면 2와 3으로 변환시켜주면 되지만, '(', '(', ')', ')'
을 위처럼 생각하면 '(', 2, ')'
의 값이 된다. 그러므로 생각한 방법이 ')' 혹은 ']'이 확인될 때, ba의 마지막 값이 '(' 혹은 ']'나온다면 2 혹은 3을 ba에 append 시킨다. 이제 ba의 값에는 (
, [
이외에 숫자가 들어가게 된다. ba의 마지막 값이 숫자이고, li에서 확인한 값이 )
혹은 ]
이라면 숫자를 이제 합하여 준다. 그렇게 해서 더해진 숫자 값에 2 혹은 3을 곱해서 ba에 append 시켜주면 된다.
예를 들어, li = '(', '[', ']', ')'
이라면
첫 번째 인덱스를 확인하여 값이 '('이므로 ba = ['(']
두 번째 인덱스를 확인하여 값이 '['
이므로 ba = ['(', '[']
세 번째 인덱스를 확인하여 값이 ']'이고 ba에서 최근 값이 '['
이므로 ba = ['(', 3]
네 번째 인덱스를 확인하여 값이 ')'이고 ba에서 최근 값이 2이고 그 다음 값이 '(' 이므로 3에서 2를 곱한 값을 추가하여 ba = [6]
이 된다.
만약 괄호가 완전한 형태가 아닐 경우가 잇으므로 예외 처리도 생각해주어야 한다.
- li에서 확인한 값이
')'
인데 ba의 마지막 값이'['
처럼 짝이 안 맞는 경우 - ba에 저장된 값이 없는데
')'
혹은']'
이 나온 경우 li = ['(', ')', '[', ']']
처럼 ba의 최종값들이 숫자들로만 구성되는 경우 (이의 경우에는ba = [6]
이 될 것이다.
이 들을 생각하여 코드를 작성하여 준다.
소스 코드
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
|
import sys
def bracket():
ba = []
for word in li:
try:
if word == "(":
ba.append("(")
elif word == "[":
ba.append("[")
elif word == ")":
tp = 0
while True:
last = ba.pop()
if last == "(":
ba.append(max(2,2 * tp))
break
elif last == "[":
return 0
else:
tp += last
elif word == "]":
tp = 0
while True:
last = ba.pop()
if last == "[":
ba.append(max(3,3 * tp))
break
elif last == "(":
return 0
else:
tp += last
except:
return 0
try:
return sum(ba)
except:
return 0
li = list(x for x in sys.stdin.readline().strip())
print(bracket())
|
cs |
'백준 > lv.3' 카테고리의 다른 글
[lv3] 2075. N번째큰수(Python 파이썬 풀이) (0) | 2021.08.08 |
---|---|
[lv3] 2493. 탑(Python 파이썬 풀이) (0) | 2021.07.31 |
[lv3] 1463.1로 만들기(Python 파이썬 풀이) (0) | 2021.03.11 |
[lv3] 1389. 케빈 베이컨의 6단계 법칙(Python 파이썬 풀이) (0) | 2021.03.10 |
[lv3] 1260. DFS와 BFS (Python 파이썬 풀이) (0) | 2021.03.10 |