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

kiki·2024년 1월 6일
0

프로그래머스

목록 보기
43/78

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/76502

문제 설명

  • 대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어진다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return하라

1차 시도

def solution(s):
    cnt = 0
    gual = {']':'[','}':'{',')':'('}
    for i in range(len(s)):
        flag = False
        tmp = s[i:]+s[:i]
        stack = []
        for j in tmp:
            if j in gual.values():
                stack.append(j)
            else:
                if not stack:
                    flag = True
                    break
                if gual[j]==stack[-1]:
                    stack.pop()
        if not stack and not flag:
            cnt+=1
    return cnt

흠 딕셔너리를 이용한 방법으로 시작 괄호 (,{,[는 stack에 넣어주고, 닫는 괄호 ),},]는 stack의 마지막 원소가 자신의 짝인지 확인해서 맞으면 pop해줌
코드 작성하면서 뭔가 간단하게 풀지 못하고 코드가 지저분해지는 것 같아서 걱정했는데 사람들 푼거 보니까 크게 다르진 않았음
흠,,, 어떤 코드가 좋은 코드일까

+추가

def solution(s):
    cnt = 0
    gual = {']':'[','}':'{',')':'('}
    for i in range(len(s)):
        flag = False
        tmp = s[i:]+s[:i]
        stack = []
        for j in tmp:
            if j in gual.values():
                stack.append(j)
            else:
                if not stack or gual[j]!=stack[-1]:
                    flag = True
                    break
                else:
                    stack.pop()
        if not stack and not flag:
            cnt+=1
    return cnt

gual[j]!=stack[-1]인지를 미리 확인하고 break 하면 위의 코드보다 조금 더 빠르게 가능하다.

정리

다른 코드들을 돌려보니까 내가 오래 걸렸던 테스트에선 매우 짧게 나오고 내가 짧게 나온 테스트에선 매우 오래 걸리는 경우가 있었다. 아마 문제 특성상 어떻게 코드를 작성했는지에 영향을 많이 받는 듯 하다. 정답은 없다!

0개의 댓글