BOJ
[BOJ] 2504. 괄호의 값
rubato.dev
2025. 7. 21. 21:16
📌 문제 제목
문제 링크: BOJ 2504
🗒️ 문제 설명
소괄호와 대괄호만을 이용해 만들어진 괄호열이 있다.
입력이 올바르지 못한 괄호열이면 0을 출력하고, 올바른 출력이면 아래의 내용을 참고하여 출력하라.
- '()'인 괄호열의 값은 2이다.
- '[]'인 괄호열의 값은 3이다.
- '(X)'인 괄호열의 값은 2 x 값(X)으로 계산된다.
- '[X]'인 괄호열의 값은 3 x 값(X)으로 계산된다.
- 올바른 괄호열 x와 y가 결합된 xy의 괄호값은 값(xy) = 값(x) + 값(y)으로 계산된다.
e.g. ( ( ) [ [ ] ] ) ( [ ] )의 괄호값은 28이다.
2 * (2 + (3 * 3)) + 2 * 3 = 22 + 6 = 28
시간 제한: 1초
메모리 제한: 128MB
1 <= ps(괄호 문자열) <= 30
💡 문제 해결 아이디어
- 여는 괄호는 스택에 추가
- 닫는 괄호
- 스택의 마지막 원소가 각 괄호의 여는 괄호가 아니면 0 출력
- 스택의 마지막 원소가 숫자라면 tmp라는 변수를 만들고 스택의 마지막 원소가 숫자가 아닐 때 까지 pop하며 tmp에 값을 더함.
- 소괄호라면 tmp x 2, 대괄호라면 tmp x 3을 스택에 추가
- 순회가 끝나면 스택에 남아있는 숫자들을 answer에 더함.
⌛️ 시간 복잡도
- O(N)
✅ 최종 코드
import sys
input = sys.stdin.readline
ps = input().strip()
def solution(ps: str) -> int:
answer = 0
stk = []
for b in ps:
if b == '(' or b == '[':
stk.append(b)
elif b == ')':
if not stk:
return 0
if stk[-1] == '(':
stk.pop()
stk.append(2)
elif isinstance(stk[-1], int):
tmp = 0
while stk and isinstance(stk[-1], int):
tmp += stk.pop()
if not stk or stk[-1] != '(':
return 0
stk.pop()
stk.append(2 * tmp)
else:
return 0
elif b == ']':
if not stk:
return 0
if stk[-1] == '[':
stk.pop()
stk.append(3)
elif isinstance(stk[-1], int):
tmp = 0
while stk and isinstance(stk[-1], int):
tmp += stk.pop()
if not stk or stk[-1] != '[':
return 0
stk.pop()
stk.append(3 * tmp)
else:
return 0
for val in stk:
if isinstance(val, int):
answer += val
else:
return 0
return answer
print(solution(ps))