BOJ

[BOJ_2504] 괄호의 값

도레미애 2022. 6. 6. 03:54

 괄호의 값

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

  1. 한 쌍의 괄호로만 이루어진 ‘`()`’와 ‘`[]`’는 올바른 괄호열이다.
  2. 만일 `X`가 올바른 괄호열이면 ‘`(X)`’이나 ‘`[X]`’도 모두 올바른 괄호열이 된다.
  3. `X``Y` 모두 올바른 괄호열이라면 이들을 결합한 `XY`도 올바른 괄호열이 된다.

예를 들어 ‘`(()[[]])`’나 ‘`(())[][]`’ 는 올바른 괄호열이지만 ‘`([)]`’ 나 ‘`(()()[]`’ 은 모두 올바른 괄호열이 아니다. 우리는 어떤 올바른 괄호열 `X`에 대하여 그 괄호열의 값(괄호값)을 아래와 같이 정의하고 값(`X`)로 표시한다.

  1. `()`’ 인 괄호열의 값은 2이다.
  2. `[]`’ 인 괄호열의 값은 3이다.
  3. `(X)`’ 의 괄호값은 2×값(`X`) 으로 계산된다.
  4. `[X]`’ 의 괄호값은 3×값(`X`) 으로 계산된다.
  5. 올바른 괄호열 `X``Y`가 결합된 `XY`의 괄호값은 값(`XY`)= 값(`X`)+값(`Y`) 로 계산된다.

예를 들어 ‘`(()[[]])([])`’ 의 괄호값을 구해보자. ‘`()[[]]`’ 의 괄호값이 2 + 3×3=11 이므로 ‘`(()[[]])`’의 괄호값은 2×11=22 이다. 그리고 ‘`([])`’의 값은 2×3=6 이므로 전체 괄호열의 값은 22 + 6 = 28 이다.

여러분이 풀어야 할 문제는 주어진 괄호열을 읽고 그 괄호값을 앞에서 정의한대로 계산하여 출력하는 것이다.

예제 입력

(()[[]])([])
[][]((])

예제 출력

28
0

🐣내 풀이 전략

  1. 원래는 stack 따로, 피연산자 따로 리스트를 만들어 구하고 싶었지만
  2. 연산하는 과정에서 막혔다.
  1. 예제1 중`(()[[]])`를 보면 `2*(2+(3*3)) ` 이다.앞에 있는 2를 전개해서 미리 값을 구해놓고 있자
    # 첫번째 생각
    2*(2+(3*3)) => 2*(2+9) => 2*11 => 22
    # 두번째 생각
    (2*2)+(2*(3*3)) => 4+(2*9) => 4+18 => 22
  2. *값을 구하면서 반복문을 진행해야하기 때문에 리스트보단 변수설정으로 판단*
  3. 나는 괄호안쪽에 있는 값부터 무조건 차례로 계산하는 생각을 했지만, 생각을 바꿨다.
  1. 곱셈되는 부분은 `temp`라는 임시변수에 저장
  2. 더하는 부분은 `ans`라는 최종답에 저장
  3. 유튜브의 stack활용의 [문제해결방법](https://www.youtube.com/watch?v=cdjjk-ryPKc)을 참고
    1. 여는 괄호가 나오면 스택에 추가
      • 괄호에 맞는 수를 곱해 `temp`에 저장
    1. 닫는 괄호가 나왔을 경우
      1. 스택이 비어있는 경우 X
      2. 스택의 top 이 짝이 맞지 않은 괄호일 경우 X
      3. 스택의 top 이 짝이 맞는 괄호이 경우 pop
        • 현재 괄호가 이전 괄호와 짝일 경우 더하는 부분으로 `ans`답으로 저장
    1. 모든 과정을 끝낸 후 스택에 괄호가 남아있는 경우 X

🐣내 풀이 코드

b = list(input())
stack = []
temp = 1
ans = 0
for i in range(len(b)):
    if b[i] == '(':
        stack.append(b[i])
        temp *= 2
        #print(stack, temp, ans)

    elif b[i] == '[':
        stack.append(b[i])
        temp *= 3
        #print(stack, temp, ans)

    elif b[i] == ')':
        if not stack or stack[-1] == '[':
            ans = 0
            break
        elif stack[-1] == '(':
            stack.pop()
            if b[i-1] == '(':
                ans += temp
            temp //= 2
            #print(stack, temp, ans)

    elif b[i] == ']':
        if not stack or stack[-1] == '(':
            ans = 0
            break
        elif stack[-1] == '[':
            stack.pop()
            if b[i - 1] == '[':
                ans += temp
            temp //= 3
            #print(stack, temp, ans)

if stack:
    ans = 0
print(ans)