https://www.acmicpc.net/problem/2504
2504번: 괄호의 값
4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일
www.acmicpc.net
💡IDEA
스택을 사용하는 문제이다.
스택을 통해서 괄호를 확인하는 것은 잘 구현했는데, 점수를 매기는 부분에서 어려움을 겪었다.
처음에는 스택 하나로 '()'와 '[]'를 모두 해결하려 했지만 두 가지 경우 따로 스택을 만들어 주는 쪽이 계산하기 편했다.
여는 괄호가 나오면 tmp에 점수를 곱하고, 닫는 괄호가 나오면 바로 직전 값이 같은 유형의 여는 괄호인 경우에만 결과값에 더해주고 tmp를 점수만큼 나누어서 되돌리는 식이다. 분배법칙이라고 생각하면 편할 듯 하다.
또 모든 괄호를 확인했음에도 스택에 값이 남아있으면 안 되므로 0을 출력해야하고, 스택이 모두 비어있는 경우에 결과값을 출력한다.
예시 입력 1을 자세히 보자.
조심해야 할 부분은 ans가 언제 갱신되는지이다. 3, 6, 11번째에서는 직전의 괄호가 현재의 괄호와 쌍을 이루는 경우이기 때문에 갱신이 되지만 7, 8, 12번째에서는 직전의 괄호가 현재의 괄호와 쌍을 이루지 않기 때문에 갱신하지 않는다.
tmp가 누적곱과 누적나눗셈을 계속하는 과정이 헷갈렸다. 문제에서 적어둔 예시에 대한 설명으로는 분배법칙을 쉽게 떠올리기 힘들 것 같다.
📌CODE
s = input()
stackA = []
stackB = []
ans = 0
tmp = 1
for i, x in enumerate(s):
if x == '(':
stackA.append(x)
tmp *= 2
elif x == '[':
stackB.append(x)
tmp *= 3
elif x == ')':
if stackA:
if s[i-1] == '(':
ans += tmp
stackA.pop()
tmp //= 2
else:
ans = 0
break
else:
if stackB:
if s[i-1] == '[':
ans += tmp
stackB.pop()
tmp //= 3
else:
ans = 0
break
if stackA or stackB:
print(0)
else:
print(ans)
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ][python] 2294. 동전 2 (0) | 2022.08.05 |
---|---|
[BOJ][python] 9205. 맥주 마시면서 걸어가기 (1) | 2022.08.04 |
[BOJ][python] 1654. 랜선 자르기 (0) | 2022.08.01 |
[BOJ][python] 2110. 공유기 설치 (0) | 2022.07.31 |
[BOJ][python] 1890. 점프 (0) | 2022.07.31 |