[프로그래머스/Lv.2] 올바른 괄호 | 스택 | 파이썬 Python

문제

https://school.programmers.co.kr/learn/courses/30/lessons/12909

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

  • "()()" 또는 "(())()" 는 올바른 괄호입니다.
  • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

 

제한사항

  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

 

입출력 예

etc-image-0

 

나의 풀이1 (실패)

def solution(s):
    stack = []

    for p in list(s):
        if p == "(":
            stack.append(p)
        elif p == ")" and stack:
            stack.pop()
    
    return False if len(stack) else True
  • 스택을 사용해서 문자열이 "("인지, ")"인지에 따라 append()pop()을 실행한다.
    • 스택이 비어있지 않은 경우에만 pop()을 하기 때문에 짝을 맞출 수 있다.
  • 최종적으로 스택에 남은 요소가 없다면 괄호가 모두 짝을 찾았다는 의미이므로 True를 반환한다.
  • 하지만 이 풀이는 테스트 케이스 2개를 통과하지 못하면서 실패했다.

 

나의 풀이2 (통과)

def solution(s):
    stack = []
    
    if s[0] == ")":
        return False

    for p in list(s):
        if p == "(":
            stack.append(p)
        elif p == ")" and stack:
            stack.pop()
    
    return False if len(stack) else True
  • 엣지 케이스를 테스트해 추가하다가 문자열이 ")))"인 경우에  통과하지 못한다는 것을 발견했다.
  • if문으로 첫 문자열이 ")"인 경우에는 바로 False를 반환하는 부분을 추가했다.

 

다른 사람의 풀이

def solution(s):
    stack = []

    for p in list(s):
        if p == "(":
            stack.append(p)
        else:
            try:
                stack.pop()
            except IndexError:
                return False
    
    return len(stack) == 0
  • try-except문으로 IndexError가 발생하면 바로 False를 반환한다.
    • 나는 IndexError가 발생하는 것을 방지하기 위해 p == ")" and stack이라는 조건을 추가한 거였는데, 예외 처리로 접근할 수도 있다는 점을 새로 배웠다.
  • boolean 값을 반환할 때 삼항연산자 말고 바로 len(stack) == 0을 출력해도 된다!

 

회고

etc-image-1

  • 2023년에 시도했다가 무수히 실패했던 문제라, 오늘은 바로 어떻게 풀지 떠올리고 통과한 게 많이 성장했구나 싶어서 뿌듯했다.