문제 링크
https://www.acmicpc.net/problem/4949
4949번: 균형잡힌 세상
하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마
www.acmicpc.net
풀이
원래는 defaultdic(int)로 풀려고 했다
- i가 '(' 이나 '[' 이면 dic[i] += 1
- i가 ')' 이나 ']' 이면 dic[i] -= 1
이 때, dic[i]의 값이 음수이면 no
- dic['(']나 dic['[']가 0이 아니면 no
- 둘 다 0 이면 yes
그러나 이렇게 풀면 아래와 같은 경우 yes로 판단..
Help( I[m being held prisoner in a fortune cookie factory)].
#틀린 코드
from collections import defaultdict
while True:
s = input()
result = True
dic = defaultdict(int)
if s == '.':
break
for i in s:
if i == '(' or i =='[':
dic[i] += 1
elif i == ']':
dic['['] -= 1
if dic['['] < 0 :
print('no')
result= False
break
elif i == ')':
dic['('] -= 1
if dic['('] < 0 :
print('no')
result = False
break
if result :
if dic['('] != 0 or dic['['] != 0 :
print('no')
else:
print('yes')
따라서 stack으로 변경해서 풀었다.
stack = []
while True:
s = input()
result = True
stack = []
if s == '.':
break
for i in s:
# stack에 추가
if i == '(' or i =='[':
stack.append(i)
# stack이 비어있지 않고 쌍이 맞으면 pop 틀리면 no 출력
elif i == ']':
if len(stack) > 0 and stack[-1] == '[':
stack.pop()
else :
print('no')
result = False
break
# stack이 비어있지 않고 쌍이 맞으면 pop 틀리면 no 출력
elif i == ')':
if len(stack) > 0 and stack[-1] == '(':
stack.pop()
else :
print('no')
result = False
break
if result :
# 스택에 괄호가 남아있으면 No
if stack:
print('no')
else:
print('yes')
'개발 > algorithm' 카테고리의 다른 글
[프로그래머스][level2] 가장 큰 수 -python (0) | 2022.02.04 |
---|---|
[백준 3986번] 좋은 단어 -python (0) | 2022.02.04 |
[백준 1874번] 스택 수열 - python (0) | 2022.02.04 |
[백준 10828번] 스택 - python (0) | 2022.02.04 |
[프로그래머스][level2] 다리를 지나는 트럭 - python (0) | 2022.02.03 |