프로그래머스 – 올바른 괄호 문제 Python

프로그래머스 문제풀이

문제

문제설명

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

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

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

제한사항

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

입출력 예

sanswer
“()()”true
“(())()”true
“)()(“false
“(()(“false

입출력 예 설명

입출력 예 #1,2,3,4
문제의 예시와 같습니다.

문제해결과정

  1. “(“와 “)”가 한쌍을 이루어 올바른 괄호라고 인정된다.
  2. 즉, “)”가 나올때 “(“가 있는지 확인하고 같이 제거해주면 될 듯하다.
  3. 스택을 사용해서 “(“는 바로 스택에 넣어준다.
  4. “)”가 나왔을때는 앞 요소가 “(“인지 확인하고 맞다면 “(“를 스택에서 제거하고, 아니라면 “)”을 스택에 쌓아준다.
  5. 반복한다.
  6. 최종적으로 반복이 종료됐을때 스택의 길이를 확인해서 0 이 아니라면 False 값을 반환한다.

위 같은 문제 및 제한사항을 해석하고 문제풀이를 시작하면 됩니다.

* 스택이란?
스택은 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 구조(LIFO – Last In First Out)이다.

나의 풀이

def solution(s):
    answer = True
    stack = []
    for v in s:                         # s 변수의 값을 하나싹 추출
        if v == ")":                    # ")"라면
            if len(stack)>0:            # 스택이 1이상일때면 
                if stack[-1]=="(":      # 스택 마지막 요소가 "("이라면
                    stack.pop()         # 스택 마지막 값 반환제거
                else:                   # 스택 마지막 요소가 "("가 아니라면
                    stack.append(v)     # 스택 마지막에 ")"를 추가
            else:                       # 스택이 1이상이 아니라면 
                stack.append(v)         # 스택 마지막에 ")"를 추가
        else:                           # "("라면
            stack.append(v)             # 스택에 추가
    if len(stack)!=0:                   # 스택길이가 0이 아니면 
        answer = False                  # answer은 False 
    return answer

다른 사람의 풀이

이번 문제는 파이써닉한 다른 풀이를 찾지못해서 따로 입력하지 않았습니다.