[프로그래머스] 올바른 괄호 - LV.2

지히·2022년 6월 30일
0

알고리즘

목록 보기
2/8

📑문제 주소

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

🔥 문제 설명

하나의 문자열 s가 주어진다.
주어진 s는 "(" 와 ")"로 이루어져 있고, "("문자를 통해 열린 괄호는 반드시 ")"문자를 통해 닫혀야 한다.
이때 ")"를 통해 닫힌 완벽한 문자열일 경우 True, 아닐경우 False를 반환한다.


🔥 나의 풀이

직관적으로 stack을 써서 풀어야 한다는것을 느꼈지만, 혼자 짜는데 익숙치 못해 코드가 많이 지저분해졌다.

from collections import deque
def solution(s):
    stack = deque()
    for i in range(len(s)):        
        if s[i] == "(":
            stack.append(s[i])
        elif len(stack) == 0:
            return False
        else:
            stack.pop()
    
    if len(stack): #stack이 완전히 비워지지 않은경우
        return False
    else:
        return True

"("문자일 경우, stack에 넣고, ")"문자일 경우, pop을 한다. 다 끝난 뒤, stack이 비어있지 않으면 다 완료되지 않은 문자열이라고 판단하여 False를 return한다.
다만, 중간에 ")"이 먼저 들어온 경우 비어있는 stack에서 pop을 하려고 하니 오류가 났다. 이 경우에는 어떠한 문자가 들어와도 괄호가 닫힐 수 없어 그냥 바로 False를 return하도록 하였다.


✅ 다른 사람의 풀이

문제가 개편되어 구글링을 통해 다른사람의 풀이를 살펴보았다. 의외로 stack을 안쓰고 푼 사람도 있고, list로 stack을 구현한 사람도 있었다. 아래는(python은 아니지만) 가장 신기했던 풀이법이다.

function solution(s){
   var answer = true;
   let sum = 0
   for(let i = 0; i<s.length; i++){
       s[i] ==='(' ?  sum++ : sum--
        if(sum < 0) break
   }
   return sum === 0;
}

그냥 sum 변수 하나로 사용가능한 점이 생소하고 마지막 return도 저렇게 간단하게 처리한부분이 신기하다.


profile
알고리즘 천재가 될꺼야:)

0개의 댓글