본문 바로가기
알고리즘/스택 \ 큐 \ 덱

#10 [파이썬] 백준 4949번 문제: 균형잡힌 세상

by 채채씨 2021. 4. 7.
728x90
반응형

<문제>

www.acmicpc.net/problem/4949

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

 


 

<소스코드>

while True:
    s = input()
    if s == '.':
        break
    tmp = []
    result = True
    for j in s:
        if j == "(" or j == "[":
            tmp.append(j)
        elif j == ")":
            if not tmp or tmp[-1] == "[":
                result = False
                break
            elif tmp[-1] == "(":
                tmp.pop()
        elif j == "]":
            if not tmp or tmp[-1] == "(":
                result = False
                break
            elif tmp[-1] == "[":
                tmp.pop()
    if not tmp and result == True:
        print("yes")
    else:
        print("no")

 

<NOTE>

 

1. 입력의 개수가 주어지지 않고 입력의 종료조건이 주어졌을때 반복문

while True를 통해 무한루프를 돌려 종료조건에 해당하면 break로 종료한다.

while True

 

while 1이나 while "hello"와 같은 0이아닌 숫자나 내용이있는 문자열도 True로 취급하여 무한루프로 동작한다

while 1
while "hello"

 

 

2. Solution

( )과 [ ]의 균형을 맞추기 위해 기본 아이디어는 문자열 s내에서 "(" 또는 "["이 나오면 빈 리스트 tmp에 넣고, ")" 또는 "]"이 나오면 리스트에서 각각 "("과 "["을 제거하는 것이다. 여기서 ")" 또는 "]"이 나오면 첫번째로 나온 것이 아닌지 체크해야하고, tmp에 마지막으로 들어간 것이 각 기호와 균형을 이루는 기호인지를 체크해야한다. 그것을 체크하는 코드는 아래와 같다.

        elif j == ")":
            if not tmp or tmp[-1] == "[":
                result = False
                break

 

        elif j == "]":
            if not tmp or tmp[-1] == "(":
                result = False
                break

 

result를 True로 초기화하고, 위의 두 곳에서 result를 False로 두는 이유는 그냥 break를 하면 최종적으로 결론을 내릴 때, tmp가 비어있는 것이 균형이 잡힌 문자열이라서 비어있는 것인지 아니면 균형이 맞지 않아 break를 걸어서 비어있는 것인지 구분할 수 없다. 따라서 result로 구분을 해준 후, 최종적으로 tmp가 비어있으면서 result == True인 경우 "yes"를 출력하고, 그 이외에는 "no"를 출력한다. 

 

728x90
반응형

댓글