코딩 테스트/Baekjoon

S2 4949. 균형잡힌 세상

  • -
728x90
반응형

문제 보기 :  4949번: 균형잡힌 세상


문제

  • 정답률 : 32%


작성 코드

# import sys
# input = sys.stdin.readline

while True:
    inp = list(input())
    a = 0
    b = 0
    p = True
    
    if inp == ['.']:
        break

    before = []
    for i in inp:
        if i == '[':
            b += 1
            before.append('[')
        elif before and before[-1] == '[' and i == ']':
            b -= 1
            before.pop()
        elif (not before or before[-1] != '[') and i == ']':
            p = False
            break

        elif i == '(':
            a += 1
            before.append('(')
        elif before and before[-1] == '(' and i == ')':
            a -= 1
            before.pop()
        elif (not before or before[-1] != '(') and i == ')':
            p = False
            break
        
        if a < 0 or b < 0 :
            p = False
            break
    if p and a == 0 and b == 0:
        print('yes')
    else:
        print('no')

풀이

맨 위 두줄을 보면, sys 라이브러리로 입력을 한번에 받아오도록 했지만 이 문제에서는 그게 오히려 독이 됐다. (출력 초과가 발생했다.)

코드를 설명해보자면, a는 '('의 등장 수를, b는 '['의 등장 갯수를 확인한다.
그리고 before는 스택 구조인데, 활용한 이유는 '([)].' 이런 경우를 처리하기 위해서..
단순히 a,b만 두고 구하면 위의 케이스에도 yes로 출력한다. 그래서 before 스택을 두고 ')'인 경우 before, a, b를 확인하도록 했다.

그리고 처음에는 p를 False로 변경하는 시점에 no를 출력하도록 하고 맨 아래 else를 두지 않았다.
근데 그렇게 하면... [][. 이런 경우엔 아무것도 출력하지 않는... 예외가 발생했다.

그래서 아예 p가 False가 되면 아무것도 출력하지 않고 break만 시킨 뒤에
맨 아래 else문을 두어 no이 무조건 1번만 출력되도록 했다.

320x100
728x90

'코딩 테스트 > Baekjoon' 카테고리의 다른 글

G5 7569. 토마토  (0) 2024.11.27
S4 1764. 듣보잡  (0) 2024.11.26
S2 1182. 부분수열의 합  (0) 2024.11.22
G5 10026. 적록색약  (0) 2024.11.19
S2 11279. 최대 힙  (0) 2024.11.18
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.