jyamethyst21 님의 블로그

백준 9012번- '괄호' (PYTHON 풀이) 본문

CODING 💻

백준 9012번- '괄호' (PYTHON 풀이)

jyamethyst21 2025. 10. 22. 17:13

문제:

 

예시와 같이 괄호가 정상적으로 잘 닫히게 문자열을 받으면 YES, 그게 아니면 NO를 출력하면 되는 문제이다.

'()' 뿐만 아니라 '(()())((()))'와 같이 여러개의 괄호가 존재한다고 해도, 순서에 맞게 잘 닫히기만 하면 무조건 YES를 출력하게 해야 한다.

 

 

풀이:

T = int(input())
li = []

for i in range(T):
    a = list(input())
    leftcount = 0
    rightcount = 0
    for j in range(len(a)):
        if a[j] == '(':
            leftcount+=1
        else:
            rightcount+=1
    if rightcount == leftcount:
        print('YES')
    else:
        print('NO')

처음에는 단순하게 여는 괄호와 닫히는 괄호의 개수만 맞으면 풀리려나 싶어서 냅따 코드부터 작성했었다. 그런데 이 경우에는 적고나서 생각해보니 '())(' 와 같은 경우 제대로 판별할 수 없게 된다. 즉, 개수가 같다하더라도 여는 괄호가 먼저 나오지 않고 닫히는 괄호가 먼저 나온다면 VPS 성립이 되지 않아 NO가 출력되어야 하는 것이다.

 

T = int(input())

for i in range(T):
    a = list(input())
    count = 0
    for j in range(len(a)):
        if a[j] == '(':
            count+=1
        else:
            count-=1
        if count < 0:
            print('NO')
            break
    else:
        if count == 0:
            print('YES')
        else:
            print('NO')

그래서 기존 코드를 조금 변형해서 위와 같이 작성하였다.

우선 처음 코드를 작성했을 때 느꼈던 것이 여는 괄호가 항상 먼저 시작해야한다는 점과 그 '(', ')' 이 두개의 합계가 같아야 한다는 점이다.

다시 말해서 여는 괄호가 나올 때 +1, 닫는 괄호가 나올 때 -1을 해서 합계가 0이 되면 결국 같은 개수과 나왔다는 것이므로 굳이 변수를 두개나 쓰지 않아도 좀 더 간단하게 풀이가 가능하다!

 

여는 괄호가 항상 먼저 시작해야한다는 내용의 코드는 if문을 하나 더 써서 해결이 가능하다.

닫히는 괄호는 -1을 해주는 역할이기 때문에 각 자리를 돌다가 만약 음수가 되는 상황이 발생하면 이것은 결국 닫히는 괄호가 먼저 나왔다는 의미가 된다. 그러므로 바로 'NO'를 출력해주고 break를 통해 해당 반복문을 탈출한다.

또한, for ~ else문을 활용해서 닫히는 괄호가 먼저 나오지 않고 정상적으로 루프를 돌았을 때는 count가 0인지 검사 후 최종 결과를 출력하도록 하였다. 다들 if ~ else문을 들어봤어도, for ~ else문은 생소하실 것 같은데, for문도 else문 활용이 가능하다. for문의 else 부분은 for문 안에 있는 내용이 break와 같이 강제로 취소시켜서 나오지 않고 정상적으로 전부 실행될 경우 else문 안에 있는 내용을 실행하게 해준다. 그러므로 break를 통해 탈출한 부분은 실행이 되지 않으므로 음수가 나왔을 때 'NO'는 한번만 실행되고 이중으로 출력되지 않게 해주는 역할을 한다.

 

로직을 어떤 식으로 짜야하는지 은근 시간이 좀 들었던 문제이다. 이중 for문이라 시간 복잡도도 걱정되었는데 다행히 풀렸다!