Algorithm

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

비번변경 2023. 6. 29. 17:58

문제

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

 

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

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

 

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

 

 

풀이

괄호는 가장 마지막에 열린 것부터 닫힌다. 그리고 Stack은 가장 마지막에 추가된 값이 먼저 삭제된다. 괄호와 Stack의 특징을 상기하면 쉽게 문제를 해결할 수 있다.

 

1. 괄호가 열리면 Stack에 값을 추가한다.

if s == '(':
    stack.append(s)

 

2. 괄호가 닫히면 Stack에서 값을 뺀다.

이 때 Stack이 비어있으면 열려 있는 괄호가 없는 상태이므로 올바른 괄호라고 볼 수 없다. 예외로 처리하여 false를 반환하거나 조건문을 이용해 먼저 확인한다.

elif s == ')':
    try:
        stack.pop()
    except:
        return False

 

3. 위 과정을 문자열이 끝날 때까지 반복한다.

stack = []
for s in str_val:
    if s == '(':
        stack.append(s)
    elif s == ')':
        try:
            stack.pop()
        except:
            return False

 

4. 문자열이 끝나면 Stack에 남아 있는 괄호가 없어야 한다.

stack의 비어 있으면 True를, 아니면 False를 반환한다.

return not stack

 

 

전체 코드

def solution(str_val):
    stack = []
    for s in str_val:
        if s == '(':
            stack.append(s)
        elif s == ')' :
            try:
                stack.pop()
            except:
                return False
            
    return not stack

 

 

참고 문서

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

 

 

728x90