[Python]BaekJoon.AC

[Python]백준 BaekJoon.AC 4949 : 균형잡힌 세상(list, stack)

스뇨잉 2022. 1. 21. 15:40
728x90
728x90

 

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

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

 

 

간단해보였지만 꽤나 애먹은 문제다..

한줄씩 그 자체를 string으로 받아줬고, 한글자씩 for 처리하여 진위를 판별했다.

게 중  [  (  가 등장한다면 리스트에 등록해줬다.

처음엔  ]  ) 도 등록해줘 함께 처리하려 했는데, 일이 점점 더 많아지더라..

다른 사람들의 코드를 참고했더니  [  (  를 리스트에 저장하고,

]  ) 가 나오면 가장 마지막에 저장된 리스트 목록을 살펴 진위를 판별하는 코드가 대부분이었다.

 

 

신기한 부분은 

            if bal and bal[-1] == "[":
                bal.pop()

였다.    「  if 리스트 :  」  은 리스트가 비어있는지 확인해주는 역할을 한다. 정말 파이썬스럽더라...

len이나 empty 사용할 생각만 했지 이런 기능이 있는지 몰랐다.

 

 

리스트[-1]은 가장 마지막에 넣어둔(마지막 목록값)을 꺼내준다.

우선 리스트에 (  또는  [  이 하나라도 있는지 확인해주고(안하면 오류), 있다면 마지막 애를 꺼내 부합하는지 확인해준다.

짝이 맞다면 pop처리해준다.

 

검사를 다 마치면 배열이 다 비었는지(모두 pop처리 됐는지) 검사를 진행해준다.

이는 앞서 nonpass 변수로 체크해줬다.

 

여러번 틀려가며 찾아냈는데, 마지막 검사까지 배열이 모두 비었는지 확인해주는게 중요하다.

반례  「 ()(  」  를 참고하면 이해하기 쉽다.

 

 

우여곡절 많았던 문제...! 그만큼 새로 알게 된 것들도 많다.. 나에게 파이썬은 아직 어렵다!

큐나 스택을 모두 리스트로 간단히 처리하는 것도 아직 헷갈리고 복잡하다..

 

 

아, 이 문제는 input()을 사용했다.

sys.stdin.readline으로 해봤는데, 컴마를 잡아내기가 쉽지 않았다.

sys는 한 글자를 스트링으로 입력받으면 \n까지 받아진다나 뭐라나... 무튼 개행문자 제거해주기 귀찮으니 input을 사용했다.

input은 개행을 애초에 제거해주는 멋진 아이다. 다만 느려서..

 

 

 

while True:
    string = input()
    if string == ".":
        quit()

    bal = []
    nonpass = False
    for s in string:
        if s == "[" or s == "(":
            bal.append(s)
        elif s == "]":
            if bal and bal[-1] == "[":
                bal.pop()
            else:
                nonpass = True
                break
        elif s == ")":
            if bal and bal[-1] == "(":
                bal.pop()
            else:
                nonpass = True
                break

    if not bal and nonpass == False:
        print("yes")
    else:
        print("no")

 

 

728x90
728x90