코딩테스트[파이썬]/입문자를 위한 코딩테스트 핵심

[스택] - 올바른 괄호

softmoca__ 2024. 1. 23. 14:03
목차

올바른 괄호

괄호 문자열이 입력되면 올바른 괄호이면 "YES", 올바르지 않으면 "NO"를 출력합니다.

(())() 이것은 괄호의 쌍이 올바르게 위치하는 거지만, (()()))은 올바른 괄호가 아니다.

제한사항:
• 문자열 s의 길이는 100을 넘지 않습니다.

 

나의 코드

 

def solution(s):
    answer = 'YES'
    stack=[]

    for x in s:
        if x=='(':
            stack.append(x)
        elif stack and x==')':
            stack.pop()
        elif len(stack)==0 and x==')':
            answer="NO"
        
    if len(stack)>0:
        answer="NO"

    return answer


print(solution("((()))()"))
print(solution("(()(()"))
print(solution("()())"))
print(solution("())("))
print(solution("((())))()("))

괄호의 한 쌍인 ()를 맞추기 위해  ( 일 경우 스택에 쌓고 )인 경우 pop을 한다.

그러면 올바른 괄호의 경우 모든 입력값이 들어온 뒤 스택은 빈 스택이 된다.

하지만 이상이 있는 스택은 두가지 형태로 나타난다.

1. 스택이 비었는데 )가 들어온 경우 [   ) 가 더 들어 경우]

2. 모든 입력값 이후 스택에 값이 남아있는경우 [   ( 가 더 들어온 경우    ]

 

 

정답 코드

def solution(s):
    answer = "YES"
    stack = []
    for x in s:
        if x == ')':
            if len(stack) == 0:
                return "NO"
            stack.pop()
        else:
            stack.append(x)

    if len(stack) > 0:
        return "NO"

    return answer


print(solution("((()))()"))
print(solution("(()(()"))
print(solution("()())"))
print(solution("())("))
print(solution("((())))()("))