[프로그래머스] LEVEL2 괄호 회전하기 (Python)
🧐 문제 설명
😍 나의 풀이
문제를 읽자마자 얼마 전에 풀었던 [프로그래머스] LEVEL2 올바른 괄호 이 문제가 생각이 났다. 이 문제는 () 소괄호 하나만 나와서 여는 괄호와 닫는 괄호가 나올 때마다 count를 각각 +1 하고 닫는 괄호의 수가 여는 괄호의 수보다 많아질 때마다 올바르지 않은 괄호로 판단하여 False처리했다.
#[프로그래머스] LEVEL2 올바른 괄호 소스코드
def solution(s):
open_count = 0
close_count = 0
for i in s:
if i == '(':
open_count += 1
else:
close_count += 1
if close_count > open_count:
return False
else:
if open_count != close_count:
return False
return True
이런식으로...
이번 문제도 이렇게 여는 괄호와 닫는 괄호의 수를 count해서 풀이하면 되겠다 싶어서 똑같이 풀이했다.
결과는 TC 13, 14 2가지를 통과하지 못해서 Fail...😭
처음 생각한 로직에서 발견한 문제점!!!
count하는 방식으로 풀이하면 '[(])' 이런 괄호 문자열도 count 수가 같기 때문에 올바른 문자열이라고 판단하는 문제가 발생했다.
그래서 stack을 이용해서 top 상단 2문자를 비교해 올바른 괄호('[]','()','{}')이면 pop하는 방식으로 변경했다.
def is_correct(s): # 올바른 괄호 문자열인지 체크하는 함수
stack = []
for i in s:
stack.append(i) # stack에 값을 하나씩 넣고 top 2자리가 올바른 괄호이면 pop
if ''.join(stack[-2:]) in ('[]','()','{}'):
stack.pop()
stack.pop()
if not stack: # stack이 비어있다는 건 모든 괄호들이 짝지어서 pop되었다는 뜻이므로 올바른 문자열
return True
else:
return False
from collections import deque
def solution(s):
s = deque(s)
answer = 0
for i in range(len(s)): # 덱으로 s길이 만큼 회전
this = s.popleft()
s.append(this)
if is_correct(s):
answer += 1
return answer
👏 다른 사람의 풀이
def is_valid(s):
stack = []
for ch in s:
if not stack:
stack.append(ch)
elif stack[-1] == '(':
if ch==')': stack.pop()
else: stack.append(ch)
elif stack[-1] == '{':
if ch=='}': stack.pop()
else: stack.append(ch)
elif stack[-1] == '[':
if ch==']': stack.pop()
else: stack.append(ch)
return False if stack else True
def solution(s):
answer = 0
for i in range(len(s)):
answer += is_valid(s[i:]+s[:i])
return answer
🥇 Today I Learn
괄호가 올바른 지 같은 문제는 stack같은 자료구조를 이용해 풀이하는 게 확실히 정확하다. count 하는 방식도 좋은 아이디어 일 수 있지만 무작정 코딩하기보다는 테스트 케이스를 좀 더 고려해야할 것 같다.
Author And Source
이 문제에 관하여([프로그래머스] LEVEL2 괄호 회전하기 (Python)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sem/프로그래머스-LEVEL2-괄호-회전하기-Python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)