
https://school.programmers.co.kr/learn/courses/30/lessons/12909
문자열 s가 주어진다.
괄호가 올바르게 짝 지어지면 true, 그렇지 않으면 false를 반환해야한다.
올바르게 짝 지어졌다는 것은,
스타트를 '(' 로 하고 피니시를 ')' 로 하되, 그 안에 괄호들이 짝을 지어서 들어가 있어야 한다.
이 문제는 stack 자료구조를 활용하여 풀 수 있다.
test 라는 리스트를 만든다.
문자열 s를 순회하며
1. 첫 요소를 검사한다.
def solution(s):
test = []
# 첫 문자 검사
if s[0] == "(":
test.append("(")
else:
return False
## 두번째 문자열부터 보고 싶기에 슬라이싱
new_s = s[1:]
for i in range(len(new_s)):
char = new_s[i]
if char == "(":
test.append(char)
else:
if test:
test.pop()
else:
return False
# 마지막 문자 검사
if i == len(new_s) - 1 :
if test:
return False
else:
return True
이렇게 첫 문자, 중간 문자열, 마지막 문자를 검사하는 방식으로 진행했는데
10개중 9개는 통과하고 첫번째 테스트 케이스에서 실패가 나왔다.
이유를 찾아보니 두번째 문자열에서 슬라이싱을 하는데 s가 "(" 이렇게 주어지면
new_s 는 None 이 되는 엣지케이스가 있었다.
그렇기에 마지막 문자를 검사하는 것이 아닌, 모든 루프가 끝나고 최종 판단하는 로직으로 바꿔서 통과할 수 있었다.
def solution(s):
test = []
# 첫 요소 검사
if s[0] == "(":
test.append("(")
else:
return False
## 두번째 문자열부터 보고 싶기에 슬라이싱
new_s = s[1:]
for i in range(len(new_s)):
char = new_s[i]
if char == "(":
test.append(char)
else:
if test:
test.pop()
else:
return False
# 3) 루프가 끝난 뒤 최종 판단 (스택이 비어있어야 올바름)
def solution(s):
test = []
# 첫 요소 검사
if s[0] == "(":
test.append("(")
else:
return False
## 두번째 문자열부터 보고 싶기에 슬라이싱
new_s = s[1:]
for i in range(len(new_s)):
char = new_s[i]
if char == "(":
test.append(char)
else:
if test:
test.pop()
else:
return False
## 루프가 끝나고 검사
if test:
return False
else:
return True