본문 바로가기
코딩테스트 연습

[프로그래머스/Python] Lv. 2 괄호 회전하기

by 빙수야 팥빙수야 2023. 8. 10.

🔗 문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝 문제 요약

( ), { }, [ ] 는 모두 올바른 괄호 문자열입니다.

대괄호, 중괄호 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다.

s를 왼쪽으로 x(0 <= x < (s의 길이)) 의 칸만큼 회전시켰을 때,

s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하세요.

 

왼쪽 사진: 입출력 예, 오른쪽 사진: 입출력 예 설명 #2

 

🔍 문제 풀이 (feat. 접근 방법)

  1. s의 길이 만큼 for문을 돈다. (회전하는 용도의 for문)
  2. 이중 for문을 돈다. (괄호의 짝이 맞는지 확인하는 for문)
  3. 2차 for문 안에서 괄호의 짝이 맞는지 확인한다. 맞다면 answer에 +1을 한다.
  4. 1차 for문 안에서 s [0] 문자열을 s [-1]로 옮긴다.
  5. 3,4번을 반복한다.
  6. answer를 return 한다.

🤔 풀다가 막혔던 부분

프로그래머스에서 다른 테스트케이스(TC)는 다 통과를 하는데 14번 TC만 실패를 했다.

알고 보니, "{ ( } )"와 같이 괄호끼리 서로 포개어진 경우 마지막 elif 문을 타고 stack이 비워져야 하는데 값이 남아있어서 TC 통과를 못했던 것이다.

이 부분 수정을 위해 마지막 elif문에 stack = [ ] 문장을 추가로 넣어주었다.

 

👩🏻‍💻 전체 코드

def solution(s):
    answer = 0
    s = list(s)
    stack = []
    
    for i in range(len(s)):
        for p in s:
            if p == "(":
                stack.append(")")
            elif p == "[":
                stack.append("]")
            elif p == "{":
                stack.append("}")
            elif not stack or stack.pop() != p:
                answer -= 1
                stack = []
                break
                
        if len(stack) == 0:
            answer += 1
        s.append(s[0])
        s.remove(s[0])

    return answer