문제
https://school.programmers.co.kr/learn/courses/30/lessons/12909
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항
- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
입출력 예

나의 풀이1 (실패)
def solution(s):
stack = []
for p in list(s):
if p == "(":
stack.append(p)
elif p == ")" and stack:
stack.pop()
return False if len(stack) else True
- 스택을 사용해서 문자열이 "("인지, ")"인지에 따라
append()
와pop()
을 실행한다.- 스택이 비어있지 않은 경우에만
pop()
을 하기 때문에 짝을 맞출 수 있다.
- 스택이 비어있지 않은 경우에만
- 최종적으로 스택에 남은 요소가 없다면 괄호가 모두 짝을 찾았다는 의미이므로
True
를 반환한다. - 하지만 이 풀이는 테스트 케이스 2개를 통과하지 못하면서 실패했다.
나의 풀이2 (통과)
def solution(s):
stack = []
if s[0] == ")":
return False
for p in list(s):
if p == "(":
stack.append(p)
elif p == ")" and stack:
stack.pop()
return False if len(stack) else True
- 엣지 케이스를 테스트해 추가하다가 문자열이 ")))"인 경우에 통과하지 못한다는 것을 발견했다.
- if문으로 첫 문자열이 ")"인 경우에는 바로
False
를 반환하는 부분을 추가했다.
다른 사람의 풀이
def solution(s):
stack = []
for p in list(s):
if p == "(":
stack.append(p)
else:
try:
stack.pop()
except IndexError:
return False
return len(stack) == 0
try-except
문으로IndexError
가 발생하면 바로False
를 반환한다.- 나는
IndexError
가 발생하는 것을 방지하기 위해p == ")" and stack
이라는 조건을 추가한 거였는데, 예외 처리로 접근할 수도 있다는 점을 새로 배웠다.
- 나는
- boolean 값을 반환할 때 삼항연산자 말고 바로
len(stack) == 0
을 출력해도 된다!
회고

- 2023년에 시도했다가 무수히 실패했던 문제라, 오늘은 바로 어떻게 풀지 떠올리고 통과한 게 많이 성장했구나 싶어서 뿌듯했다.