문제
2504번: 괄호의 값
4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일 X
www.acmicpc.net
입력
- 첫째 줄에 괄호열을 나타내는 문자열(스트링)이 주어진다. 단 그 길이는 1 이상, 30 이하이다.
출력
- 첫째 줄에 그 괄호열의 값을 나타내는 정수를 출력한다. 만일 입력이 올바르지 못한 괄호열이면 반드시 0을 출력해야 한다.
입력 예제
(()[[]])([])
출력 예제
28
문제 풀이
- 열린 괄호
- 임시변수에 각 괄호 값에 맞는 값을 곱하고, 스택에 열린 괄호를 넣는다.
- '('는 2를 곱하고, '['는 3을 곱한다.
- 닫힌 괄호
- 스택이 비었거나 괄호의 모양이 맞지 않는다면, 짝이 맞지 않으므로 결괏값을 0으로 바꾼 후, break한다.
- 위 두 경우가 아닌 경우 짝이 맞는 것이다. 이 때 괄호를 입력 받은 리스트를 확인 해 바로 직전 값이 짝이 맞는 열린 괄호라면, 임시변수에 곱하는 것을 멈추고, 결괏값에 괄호가 열릴 때 마다 곱한 값(tmp)값을 더해준다.
- 괄호가 닫혔다면, 다음 탐색을 위해 닫힌 괄호의 값만큼 임시 변수에서 다시 나눈다.
- ']'는 3을 나누고, ')'는 2를 나눈다.
- 위 과정을 모두 마친 후에도 스택에 괄호가 남아있다면, 이 경우도 짝이 맞지 않는 경우이므로 결괏값을 0으로 바꿔준다.
- 모든 과정을 마쳤다면 결과를 출력한다.
코드
array = list(input())
stack = []
result = 0
tmp = 1
for i in range(len(array)):
now = array[i]
if now == '(':
tmp *= 2
stack.append(now)
if now == ')':
if not stack or stack[-1] == '[':
result = 0
break
else:
if array[i - 1] == '(':
result += tmp
tmp //= 2
stack.pop()
if now == '[':
tmp *= 3
stack.append(now)
if now == ']':
if not stack or stack[-1] == '(':
result = 0
break
else:
if array[i - 1] == '[':
result += tmp
tmp //= 3
stack.pop()
# 짝 맞는 모든 괄호 소거 후 열린 괄호가 남아 있다면 짝이 맞지 않는 것
if stack:
result = 0
print(result)
'Algorithm > Simulation' 카테고리의 다른 글
| [Python] 백준 17413번 단어 뒤집기2 (0) | 2023.06.17 |
|---|---|
| [Python] 백준 2615번 오목 (0) | 2023.05.25 |
| [Python] 백준 1063번 킹 (0) | 2023.05.24 |
| [Python] SWEA 13428번 숫자 조작 (0) | 2023.05.18 |
| [Python] SWEA 1228,1230번 암호문1, 암호문3 (0) | 2023.05.16 |