[백준] 9012 - 괄호 (Python)

문제

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

코드

import sys

testCase = int(sys.stdin.readline())

for i in range(testCase):
    line = sys.stdin.readline()
    count = 0

    for n in line: 
        if n == '(':
            count += 1
        elif n == ')':
            count -= 1
        if count < 0:
            print("NO")
            break

    if count > 0:
        print("NO")
    elif count == 0:
        print("YES")

결과


정리

설명

'('개수를 세는 count라는 변수를 만들어서 '('가 나올때는 +1 해주고 ')'가 나올때는 -1 해준다.
마지막 괄호까지 읽었을 때 count가 0인 경우는 열린 괄호 수 만큼 닫혔다는 뜻이므로 바르게 구성된 문자열이다. 반면, count가 양수인 경우는 열린 괄호 수 만큼 닫히지 않았다는 뜻이다. 즉, 열린 괄호 수가 닫힌 괄호 수보다 많다는 뜻이므로 틀린 문자열이다.

여기까지 구현했을 때 '))(('를 입력하면 '--++'가 되므로 결과적으로 count가 0이라서 "YES"가 출력될 것이다. 괄호는 열린 다음에 닫혀야 되기 때문에 틀린 문자열이다. '(' 보다 ')' 가 먼저 나오는 경우에는 count가 음수가 되므로 한글자씩 읽는 과정에서 count가 음수가 되는 경우가 발생한다면 "NO"를 출력하고 반복문을 나가는 것으로 구현했다.

코드 (주석o)

import sys

testCase = int(sys.stdin.readline()) # testCase 개수 파악

for i in range(testCase): # 6번 반복하는지 3번 반복하는지
    line = sys.stdin.readline() # 한줄씩 읽기
    count = 0 # 새로운 줄 읽을때마다 count는 0으로 초기화

    for n in line: #한글자씩 읽기
        if n == '(':
            count += 1
        elif n == ')':
            count -= 1
        if count < 0: # count가 음수가 된다는 뜻은 괄호가 열리지 않았는데 닫혔다는 뜻 (=불가능)
            print("NO")
            break

    if count > 0: # count가 양수라는 뜻은 닫히지 않은 괄호가 있다는 뜻
        print("NO")
    elif count == 0: # 열린 괄호 개수와 닫힌 괄호 개수가 같다는 뜻
        print("YES")

느낀점

주요 원리(?)를 알아내는 것은 쉬웠지만 열리는 괄호 '(' 보다 닫히는 괄호 ')' 가 먼저 나오는 경우를 처리하는 부분을 어디에 어떻게 구현해서 넣어야 코드가 깔끔해지는지 생각하는 것에 시간을 썼던 것 같다.

좋은 웹페이지 즐겨찾기