알고리즘

[프로그래머스] 올바른 괄호_Python level2(스택/큐)

작은코딩 2022. 8. 18. 21:08

🔒 문제

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 = []
    for c in s:
        if c == "(":
            stack.append(c)
        else:
            if stack:
                stack.pop()
            else:
                return False
    if stack:
        return False
    return True

🍀 Story

처음 문제를 보고 2가지 방법을 떠올렸다. 

0을 대입 연산한 변수에 s에 따라  +1, -1을 해서 음수가 나오거나 반복문이 끝난 뒤 answer가 양수인 경우 False, 0인 경우 True를 리턴하는 함수를 만드는 방법.

다른 하나는 stack 자료형에 append, pop을 해서 stack이 비어있는데 pop을 하거나 마지막에 스택에 원소가 남아있는 경우 False, 비어있다면 True를 리턴하는 방법으로 문제를 해결할 수 있었다.

 

 

[answer 변수에 0을 대입연산하여 푸는 방법]

def solution(s):
    answer = 0
    for c in s:
        if c == "(":
            answer += 1
        else:
            if answer > 0:
                answer -= 1
            else:
                return False
    if answer > 0:
        return False
    return True