[BOJ/백준] 2504. 괄호의 값 (Python)
카테고리: BOJ
🔎 문제
💡 풀이
열린괄호 (‘(‘, ‘[’..) 는 open, 닫힌괄호는 (‘)’, ‘]’..) close로 표기
일단 유효한 괄호 식 검사에 대한 기본 내용은 이렇다.
- 반복문을 돌며, 괄호가 open 형이면 스택에 담고, close 형이면 스택에서 pop해 close형인 괄호와 pop한 open형 괄호가 짝이 맞는지 검사한다.
- 짝이 맞으면 계속 진행, 안맞으면 유효한 식이 아니다.
- 이렇게 쭉 반복하고, 반복문이 끝나고 스택에 아무 괄호도 남아있지 않으면 유효한 식이다.
여기서 계산을 추가하는 데에 애를 먹었다.
괄호가 close형일때, 짝에 맞는 open형 괄호가 나올때까지 while문을 돈다.
- pop한것이 괄호일 경우
- 짝이 맞을때
- 임시값
tmp가 0이면 해당 괄호값을 스택에 추가한다. - 나는 딕셔너리 를 사용해 (, [에 따른 괄호값을 계산해 주었다.
tmp가 0이 아니라면(숫자)같은 식인 것이다. 괄호값을 곱해주어 스택에 넣어준다.
- 임시값
- 맞지 않는다면
0을 출력하고 프로그램을 종료한다.
- 짝이 맞을때
- pop한것이 숫자일 경우
tmp가 0이면tmp를 pop한값으로 초기화- 0이 아니면 pop한값을
tmp에 더해준다.
그리고 반복문이 종료되면 남은 stack을 검사한다.
- 괄호가 스택에 남아있으면 유효한 식이 아니다. 0을 출력하고 종료한다.
- 괄호가 아니라면 결과에 덧셈을 해준다.
다른 방법으로도 풀 수 있겠지만 괄호문제는 거의 스택이 정석이므로 익혀두면 좋다.
추가로 나는 코드 양을 줄이고싶어 open형, close형 모두 미리 정의해놓고 해당 리스트에 in 인지 not in인지 확인해 주었다. 짝이 맞는지 검사하는것도 딕셔너리로 if문을 길게 쓰지 않아도 되게 하였고, 괄호값도 마찬가지로 딕셔너리를 사용했다.
📃 소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
open_bracket = ["(", "["]
close_bracket = [")", "]"]
bracket_match_dic = {"(": ")", "[": "]"}
bracket_value_dic = {")": 2, "]": 3}
brackets = " ".join(input()).split() # 괄호 문자열
stack = []
result = 0
# 첫번째 괄호 닫힌것이면 유효X
if brackets[0] not in open_bracket:
print(0)
exit()
for b in brackets:
if b in open_bracket:
stack.append(b)
elif b in close_bracket:
tmp = 0
while stack:
poped = stack.pop()
if poped in open_bracket: # 괄호일 경우
if bracket_match_dic[poped] == b: # 일치
if tmp == 0:
stack.append(bracket_value_dic[b])
else: # 중첩됨
stack.append(bracket_value_dic[b] * tmp)
break
else: # 불일치
print(0)
exit()
else: # 숫자일 경우
if tmp == 0:
tmp = poped
else:
tmp += poped
# for문 끝났는데 스택에 괄호 남아있으면 유효X
for i in stack:
if i in open_bracket:
print(0)
exit()
else:
result += i
print(result)
댓글남기기