본문 바로가기

알고리즘

[프로그래머스] 올바른 괄호(python)

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

📌 문제 설명

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

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

'(' 또는 ')' 로만 이루어진 문자열 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 = []
    s = list(s)
    for i in s:
        stack.append(i)
        if i == ')':
            if len(stack) == 1:
                return False
            elif stack[-2] == '(':
                stack.pop(-2)
                stack.pop(-1)
    return len(stack) == 0

stack 배열을 하나 만들고, 입력받은 문자열 s를 배열로 만들어준다.

배열 s를 순회하면서, 일단 stack배열에 문자열을 추가한다.

이때 s의 원소가 )일 때, stack의 크기가 1이라면 바로 틀린 문자열이라고 False를 반환한다. )가 먼저 나왔다는 것 자체가 이미 옳은 문자열이 될 수 없기 때문.

만약, 크기가 1이 넘는다면, stack의 바로 전 원소를 확인한다. 만약 바로 전 원소가 (라면 짝이 잘 맞았으므로, 해당 쌍을 지워준다.

이를 반복해서 마지막에 stack의 배열이 0이면, 쌍이 다 잘 맞았다는 의미로 올바른 괄호 문자열이라 판단하여 True, 아니면 False를 반환한다.


🤔 후기

무작정 stack에 append하는 것이 일단 맘에 걸린다.

이런 스택 문제는 재밌다. 약간 테트리스 터뜨리는 기분