프로그래머스 Level 2 | 올바른 괄호 | Python 풀이

kimminjunnn·2025년 9월 4일

알고리즘

목록 보기
169/311

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


문제 파악

문자열 s가 주어진다.
괄호가 올바르게 짝 지어지면 true, 그렇지 않으면 false를 반환해야한다.

올바르게 짝 지어졌다는 것은,

스타트를 '(' 로 하고 피니시를 ')' 로 하되, 그 안에 괄호들이 짝을 지어서 들어가 있어야 한다.

이 문제는 stack 자료구조를 활용하여 풀 수 있다.

test 라는 리스트를 만든다.
문자열 s를 순회하며
1. 첫 요소를 검사한다.

  • ( 이면 test 리스트에 push(append) 한다.
  • 그렇지 않다면, false를 반환하고 종료.
  1. 두번째 요소부터 검사한다.
  • ( 이면 test 리스트에 push(append) 한다.
  • ) 이면 ( 그렇지 않다면 ), 조건을 한번 더 검사한다. test 리스트에 값이 있는 지 없는지,
    - 있다면 test 리스트에서 pop을 하여 '('를 꺼낸다.
    • 없다면 false를 반환한다.
  1. 마지막까지 반복하고 나서, test 리스트에 값이 존재하면 false, 존재하지않고 빈 배열이라면 true를 반환한다.

def solution(s):
    test = []

    # 첫 문자 검사
    if s[0] == "(":
        test.append("(")
    else:
        return False
    
    ## 두번째 문자열부터 보고 싶기에 슬라이싱
    new_s = s[1:]

    for i in range(len(new_s)):
        char = new_s[i]

        if char == "(":
            test.append(char)
        else:
            if test:
                test.pop()
            else:
                return False

        # 마지막 문자 검사
        if i == len(new_s) - 1 :
            if test:
                return False
            else:
                return True

이렇게 첫 문자, 중간 문자열, 마지막 문자를 검사하는 방식으로 진행했는데

10개중 9개는 통과하고 첫번째 테스트 케이스에서 실패가 나왔다.

이유를 찾아보니 두번째 문자열에서 슬라이싱을 하는데 s가 "(" 이렇게 주어지면
new_s 는 None 이 되는 엣지케이스가 있었다.

그렇기에 마지막 문자를 검사하는 것이 아닌, 모든 루프가 끝나고 최종 판단하는 로직으로 바꿔서 통과할 수 있었다.

해답 및 풀이


def solution(s):
    test = []

    # 첫 요소 검사
    if s[0] == "(":
        test.append("(")
    else:
        return False
    
    ## 두번째 문자열부터 보고 싶기에 슬라이싱
    new_s = s[1:]

    for i in range(len(new_s)):
        char = new_s[i]

        if char == "(":
            test.append(char)
        else:
            if test:
                test.pop()
            else:
                return False

        # 3) 루프가 끝난 뒤 최종 판단 (스택이 비어있어야 올바름)

def solution(s):
    test = []

    # 첫 요소 검사
    if s[0] == "(":
        test.append("(")
    else:
        return False
    
    ## 두번째 문자열부터 보고 싶기에 슬라이싱
    new_s = s[1:]

    for i in range(len(new_s)):
        char = new_s[i]

        if char == "(":
            test.append(char)
        else:
            if test:
                test.pop()
            else:
                return False

    ## 루프가 끝나고 검사  
    if test:
        return False
    else:
        return True
           
profile
Frontend Engineers

0개의 댓글