https://programmers.co.kr/learn/courses/30/lessons/12909
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항
문자열 s의 길이 : 100,000 이하의 자연수
문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
입출력 예
- 처음에는 '('가 나오면 +1 ')'가 나오면 -1을 해서 그 합이 0이 되면 True를 리턴했다. 물론, ')'로 시작하거나 '('로 끝나면 False처리했다. 하지만, 몇 개의 실패가 떴고 이유는 '()()))(('와 같은 문자도 True처리 되기 때문이라고 생각했다.
- 스택큐로 방향을 바꿔서 '('일 경우 리스트에 집어넣고, ')'일경우 뺐다. 만약 리스트가 비었는데 '('가 한 번 더 나와서 오류가 발생했다면, except로 return False했다.
'()'로 완전히 괄호가 완성됐을 때 ')'가 이어지면 닫을 수 없는 괄호라 False이기 때문이다.- 리스트 안이 다 비어지면 True 아니면 False이다.
def solution(s): stack = [] for i in s: if i == '(': stack.append(i) else: try : stack.pop() except: return False if len(stack) == 0: return True else: return False
빈 리스트가 나오면 False를 리턴해야 하는데 어떻게 해야하나 고민하다 except를 이용했다.
- try, except문: try 블록 수행 중 오류가 발생하면 except블록이 수행된다.
try: ... except: ...
def is_pair(s): open_cnt = 0 for c in s: if c == '(': open_cnt += 1 elif c == ')': open_cnt -= 1 if open_cnt < 0: return False return open_cnt == 0
처음에 생각했던 카운트 방식으로 푼 사람의 풀이다.
카운트가 음수가 되면 괄호를 완성할 수 없다는 점을 if로 넣어 완성했다.