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도 저렇게 간단하게 처리한부분이 신기하다.