BOJ
[BOJ_2504] 괄호의 값
도레미애
2022. 6. 6. 03:54
괄호의 값
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 이다.
여러분이 풀어야 할 문제는 주어진 괄호열을 읽고 그 괄호값을 앞에서 정의한대로 계산하여 출력하는 것이다.
예제 입력
(()[[]])([])
[][]((])
예제 출력
28
0
🐣내 풀이 전략
- 원래는 stack 따로, 피연산자 따로 리스트를 만들어 구하고 싶었지만
- 연산하는 과정에서 막혔다.
- 예제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
- *값을 구하면서 반복문을 진행해야하기 때문에 리스트보단 변수설정으로 판단*
- 나는 괄호안쪽에 있는 값부터 무조건 차례로 계산하는 생각을 했지만, 생각을 바꿨다.
- 곱셈되는 부분은 `temp`라는 임시변수에 저장
- 더하는 부분은 `ans`라는 최종답에 저장
- 유튜브의 stack활용의 [문제해결방법](https://www.youtube.com/watch?v=cdjjk-ryPKc)을 참고
- 여는 괄호가 나오면 스택에 추가
- 괄호에 맞는 수를 곱해 `temp`에 저장
- 닫는 괄호가 나왔을 경우
- 스택이 비어있는 경우 X
- 스택의 top 이 짝이 맞지 않은 괄호일 경우 X
- 스택의 top 이 짝이 맞는 괄호이 경우 pop
- 현재 괄호가 이전 괄호와 짝일 경우 더하는 부분으로 `ans`답으로 저장
- 모든 과정을 끝낸 후 스택에 괄호가 남아있는 경우 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)