[프로그래머스-레벨2]올바른 괄호 - python

iamjinseo·2022년 8월 24일
0

문제풀이-Python

목록 보기
94/134

https://school.programmers.co.kr/learn/courses/30/lessons/12909
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

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

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

제한사항
문자열 s의 길이 : 100,000 이하의 자연수
문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
입출력 예
s answer
"()()" true
"(())()" true
")()(" false
"(()(" false
입출력 예 설명
입출력 예 #1,2,3,4
문제의 예시와 같습니다.

풀이

def solution(s):
    stack = []
    for l in s:
        stack.append(l)
        if len(stack)>=2: #스택 길이가 2이상일때
            if stack[-2] == '(' and stack[-1] == ')': #완벽한 괄호 생성시
                stack.pop(); stack.pop()
    return not stack #괄호가 다 빠져서 스택이 비었으면 false이므로 not처리해서 true반환. 

문자열의 문자를 하나하나 담으면서, 올바른 괄호가 만나면 그 괄호를 빼낸다.
return not stack : 주석 그대로 해석하면 된다. 만약 stack이 비어있지 않으면 True이므로 not처리해서 False를 반환한다.

처음엔 pop을 안쓰고 stack = stack[:-2]로 했는데 효율성 테스트에서 실패해서 pop으로 바꿈.

결과


좀 느림

남의 코드

def is_pair(s):
    st = list()
    for c in s:
        if c == '(':
            st.append(c)

        if c == ')':
            try:
                st.pop()
            except IndexError:
                return False

    return len(st) == 0

(이면 append하고, )이면 append하고나서 빼지 말고 바로 pop해버린다.
IndexError가 일어나면 불완전한 괄호이므로 즉시 False리턴.
스택 길이가 0이면 True리턴.

결과


훨씬 빠름!!

profile
일단 뭐라도 해보는 중

0개의 댓글