본문 바로가기
Coding Test

백준 9012 - 괄호( Python )

by Hyeonlog 2023. 3. 6.
728x90

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

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

아마 스택 기본 문제이지 않을까 싶다.
예제로도 많이 등장하는 괄호 문제
 
1차 답안
 
n = int(input())

for i in range(n):
    data = input()
    stack = []
    
    result = 'YES'
    for  i in data:
        if i == '(':
            stack.append(i)
        else:
            if i == ')' and len(stack) == 0:
                result = "NO" # 해당 부분이 중복됨
            elif stack[-1] == '(':
                stack.pop()
            else:
                result = "NO"  # 해당 부분이 중복됨
                break 
        
        
    if len(stack) > 0: 
        result = 'NO'
    print(result)
 
 
정답을 맞추긴 했으나 찜찜하게 맞춘 부분들이 있어 다른 분들의 답변을 참고하여 다시 풀었다.
 
문제점
1. 코드의 중복
2. '(' 만 append 하는 상황에서 굳이 스택의 마지막 부분을 확인 할 이유가 없음.
 
해결
1. else 부분은 ')' 만 확인 하는 경우로 해당 구문은 필요없음 
2. stack의 길이로 빈 부분을 확인하는 것보다 스택에서 pop을 사용하는 경우를 먼저 생각

 

개선된 답

n = int(input())

for i in range(n):
    data = input()
    stack = []
    
    result = 'YES'
    for i in data:
        if i == '(':
            stack.append(i)
        else: 
            if stack: # 스택의 값이 있는 경우는 서로 짝이 맞는 경우이므로 pop
                stack.pop() 
            else: # 짝이 맞지 않는 경우로 반복문을 탈출
                result = "NO" # 중복 코드의 제거
                break 
        
    if len(stack) > 0:
        result = 'NO'
    print(result)
728x90
반응형