백준/lv.3

[lv3] 2504. 괄호의 값(Python 파이썬 풀이)

MakeMoneying 2021. 7. 28. 13:30

출처

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

 

2504번: 괄호의 값

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

www.acmicpc.net

결과

문제

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]이 된다.

만약 괄호가 완전한 형태가 아닐 경우가 잇으므로 예외 처리도 생각해주어야 한다.

  1. li에서 확인한 값이 ')'인데 ba의 마지막 값이 '['처럼 짝이 안 맞는 경우
  2. ba에 저장된 값이 없는데 ')'혹은 ']'이 나온 경우
  3. 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