알고리즘/백준(BOJ)

[백준/BOJ]#4949:균형잡힌 세상[문자열/스택/파이썬/python]

https://www.acmicpc.net/problem/4949

 

4949번: 균형잡힌 세상

하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 각 줄은 마침표(".")로 끝난다

www.acmicpc.net

내가 효율적으로 짠건지는 사실 잘 모르겠는데

내가 하는 코딩습관대로 체크플래그로 풀었다 

left괄호는 플래그 1, 2

오류는 플래그 5

 

예제들이랑 반례들 다 통과하는데 20%쯤에서 통과가 안되서 30분정도를 애먹었는데 

질문게시판에 있는 반례들이 한 6페이지까지도 다 잘 나와서 대체 뭐가 문제인지 개행문자가 문제인걸까 애를 먹고있었는데

딱 반례 '[([]])'가 no가 나와야하는데 yes가 나오는 것을 찾았다!!!

플래그로 풀었던 논리구조에 허점이 딱 있었던것이다...

그래서 괄호들만 넣는 스택 'stack'을 따로 넣어줘서 []랑 ()랑 매칭하는 논리를 추가해주니까 잘 통과했다...

 

문자열 문제들은 다 뭔가 노가다가 많은 것 같다ㅠㅠ 예제들은 다 통과하는데 틀릴때 반례들 다 넣으면서 찾는게 좀 힘든일이다

하지만 뭐 어쩌겠어해야지 ㅋ.ㅋ

 

 

 

파이썬 코드

import sys 
left=["(","["]
right = [")","]"]
checka=0
checkb=0
check=0
while True:    
        inp = str(sys.stdin.readline().rstrip())
        #inp=input()
        if inp=='.':
                break
        stack=[]
        s =list(map(str,inp.split()))
        checka, checkb, check = 0,0,0
        for i in s:
                ss = list(i)
                while len(ss)!=0:
                        cha = ss.pop(0)
                        if cha not in left and cha not in right:
                                continue
                        elif cha in left:
                                if cha==left[0] and checka!=-1:
                                        checka+=1
                                        check=1
                                        stack.append(cha)
                                elif cha==left[1] and checkb!=-1:
                                        checkb+=1
                                        check=2
                                        stack.append(cha)
                                
                        elif cha in right:
                                if cha==right[0] and check!=2:
                                    if len(stack)!=0 and stack.pop()!=left[0]:
                                        check=5
                                        break
                                    else:
                                        checka-=1
                                        check=0
                                elif cha==right[1] and check!=1:
                                    if len(stack)!=0 and stack.pop()!=left[1]:
                                        check=5
                                        break
                                    else:
                                        checkb-=1
                                        check=0
                                else:
                                    check=5
                                    break
                               
                if check==5:
                    break
        
        if checka!=0 or checkb!=0 or check==5:
                print("no")
        else:
                print("yes")
        check=0