[프로그래머스] LEVEL2 괄호 회전하기 (Python)

Loopy·2021년 7월 15일
2

프로그래머스

목록 보기
19/32
post-thumbnail

[프로그래머스] LEVEL2 괄호 회전하기


🧐 문제 설명


😍 나의 풀이

문제를 읽자마자 얼마 전에 풀었던 [프로그래머스] 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 하는 방식도 좋은 아이디어 일 수 있지만 무작정 코딩하기보다는 테스트 케이스를 좀 더 고려해야할 것 같다.

profile
공부 쫌 해!!!😂

0개의 댓글