본문 바로가기

개발/algorithm

[백준 4949번] 균형잡힌 세상 -python

문제 링크

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')