본문 바로가기

IT/Python

[프로그래머스] Lv.2 올바른 괄호 [Python]

728x90

주어진 숫자에서 k개의 digit을 빼서 가장 큰 수를 만드는 문제

더보기

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

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

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

제한사항

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

처음 작성

"$($"면 1을 더하고 "$)$"면 1을 빼서 괄호가 순서대로 짝이 맞는지 확인했습니다.

def solution(s):
    i = 0
    for t in s:
        if t == "(":
            i += 1
        else:
            i -= 1
        if i < 0:
            return False
    if i == 0:
        return True
    else:
        return False

중복되는 내용은 한 줄로 작성해서 작성

def solution(s):
    i = 0
    for t in s:
        i = i+1 if t == "(" else i-1
        if i < 0:
            break
    return i == 0

다른 방식으로 시도

"$($"면 stack에 저장하고 "$)$"면 stack에서 "$($"를 제거하는 방식으로 접근했습니다.

def solution(s):
    stack = []
    for t in s:
        if t == '(': 
            stack.append(t)
        else:
            try:
                stack.pop()
            except:
                return False
    if stack:
        return False
    return True

더 짧게 만들어보려고 했는데, 별 차이는 없네요.

def solution(s):
    stack = []
    for t in s:
        try: stack.append(t) if t == '(' else stack.pop()
        except IndexError: return False
    return stack == []

 

더보기

입출력 예

s answer
"$()()$" true
"$(())()$" true
"$)()($" false
"$(()($" false