[BOJ] 2504 괄호의 값 바로가기
4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다.
예를 들어 ‘(()[[]])’나 ‘(())[][]’ 는 올바른 괄호열이지만 ‘([)]’ 나 ‘(()()[]’ 은 모두 올바른 괄호열이 아니다. 우리는 어떤 올바른 괄호열 X에 대하여 그 괄호열의 값(괄호값)을 아래와 같이 정의하고 값(X)로 표시한다.
예를 들어 ‘(()[[]])([])’ 의 괄호값을 구해보자. ‘()[[]]’ 의 괄호값이 2 + 3×3=11 이므로 ‘(()[[]])’의 괄호값은 2×11=22 이다. 그리고 ‘([])’의 값은 2×3=6 이므로 전체 괄호열의 값은 22 + 6 = 28 이다.
여러분이 풀어야 할 문제는 주어진 괄호열을 읽고 그 괄호값을 앞에서 정의한대로 계산하여 출력하는 것이다.
첫째 줄에 괄호열을 나타내는 문자열(스트링)이 주어진다. 단 그 길이는 1 이상, 30 이하이다.
첫째 줄에 그 괄호열의 값을 나타내는 정수를 출력한다. 만일 입력이 올바르지 못한 괄호열이면 반드시 0을 출력해야 한다.
괄호열의 값을 왼쪽부터 오른쪽까지 차례대로 스택(stack
)에 추가한다.
괄호를 1개씩 추가하면서 스택의 마지막 괄호열의 값을 지속적으로 검사한다.
검사 조건은 다음과 같다.
1. stack에 마지막 2개의 원소가 '(', ')' 일 경우
2. stack에 마지막 2개의 원소가 '[', ']' 일 경우
3. stack에 마지막 3개의 원소가 '(', 숫자, ')' 일 경우
4. stack에 마지막 3개의 원소가 '[', 숫자, ']' 일 경우
5. stack에 마지막 2개의 원소가 모두 숫자일 경우
해당 조건을 만나면 문제에서 제공한 조건에 따라 값을 변경한다.
1. ‘()’ 인 괄호열의 값은 2이다.
2. ‘[]’ 인 괄호열의 값은 3이다.
3. ‘(X)’ 의 괄호값은 2×값(X) 으로 계산된다.
4. ‘[X]’ 의 괄호값은 3×값(X) 으로 계산된다.
5. 올바른 괄호열 X와 Y가 결합된 XY의 괄호값은 값(XY)= 값(X)+값(Y) 로 계산된다.
현재 스택에 존재하는 괄호열의 값이 검사 조건에 필터링이 되지 않을때까지 위 조건에 해당하는 검사를 진행한다.
while
반복문과 continue
그리고 break
명령어를 사용하여 반복적인 필터링 작업을 실행할 수 있다.
# BOJ 2504 괄호의 값
# https://www.acmicpc.net/problem/2504
from sys import stdin
def solution(bracket):
stack = []
for b in bracket:
stack.append(b)
while True:
# 조건1 → '(', ')'
if len(stack) >= 2 and (stack[-2], stack[-1]) == ('(',')'):
stack = stack[:-2] + ['2']
continue
# 조건2 → '[', ']'
if len(stack) >= 2 and (stack[-2], stack[-1]) == ('[',']'):
stack = stack[:-2] + ['3']
continue
# 조건3 → '(', '숫자', ')'
if len(stack) >= 3 and stack[-3] == '(' and stack[-2].isdigit() and stack[-1] == ')':
stack = stack[:-3] + [str(int(stack[-2]) * 2)]
continue
# 조건4 → '[', '숫자', ']'
if len(stack) >= 3 and stack[-3] == '[' and stack[-2].isdigit() and stack[-1] == ']':
stack = stack[:-3] + [str(int(stack[-2]) * 3)]
continue
# 조건5 → '숫자', '숫자'
if len(stack) >= 2 and stack[-1].isdigit() and stack[-2].isdigit():
stack = stack[:-2] + [str(int(stack[-1]) + int(stack[-2]))]
continue
break
return int(stack[0]) if (len(stack) == 1 and stack[0].isdigit()) else 0
bracket = list(stdin.readline().strip())
result = solution(bracket)
print(result)