[프로그래머스 LV.2] 괄호 회전하기 — Python 정답 & 해설

2026. 6. 16. 21:51·코딩테스트/알고리즘

🔗 1. 문제 URL

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 


 

📝 2. 문제 요구사항 정리

대괄호, 중괄호, 소괄호로 이루어진 문자열 s가 주어졌을 때, 문자열을 왼쪽으로 x칸 회전했을 때 올바른 괄호 문자열이 되는 경우의 수를 구하는 문제입니다.

  • 회전 범위: x는 0부터 s의 길이 - 1까지이며, 모든 회전 경우를 확인해야 합니다.
  • 검증 기준: 여는 괄호와 닫는 괄호의 종류와 순서가 모두 올바르게 맞아야 합니다.
  • 반환값: 올바른 괄호 문자열이 되는 회전 횟수의 개수를 반환합니다.

 


 

💡 3. 핵심 개념

✔ 1) 문자열 회전 만들기

각 x에 대해 문자열을 왼쪽으로 회전한 결과를 확인해야 합니다. Python에서는 s[i:] + s[:i] 형태로 i번째 위치부터 끝까지의 문자열과 앞부분 문자열을 이어 붙이면 회전된 문자열을 만들 수 있습니다.

✔ 2) 스택으로 괄호 유효성 검사하기

올바른 괄호 문자열인지 확인할 때는 스택을 사용합니다. 여는 괄호가 나오면 stack에 넣고, 닫는 괄호가 나오면 stack의 마지막 값이 짝이 맞는 여는 괄호인지 확인합니다.

✔ 3) 실패 조건을 빠르게 처리하기

닫는 괄호가 나왔는데 stack이 비어 있거나, stack의 마지막 괄호와 짝이 맞지 않으면 해당 회전 문자열은 더 볼 필요가 없습니다. 이때 is_valid를 False로 바꾸고 바로 반복을 종료하면 불필요한 검사를 줄일 수 있습니다.

 


 

✅ 4. 정답 Python 코드

def solution(s):
    # 대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s
    # 왼쪽으로 x칸 만큼 회전시켜야 올바른 괄호 문자열이 되게 하고, x 출력
    # 0 ~ len(s) 까지 수행. 맞으면 카운트 +1 누적
    x = 0
    pair = {']': '[', '}': '{', ')': '('}
    
    
    for i in range(len(s)):
        shifted = s[i:] + s[:i]
        
        
        stack = []
        is_valid = True
        
        
        for char in shifted:
            if char in ['[', '{', '(']:
                stack.append(char)
            else:
                if not stack or stack[-1] != pair[char]:
                    is_valid = False
                    break
                else:
                    stack.pop() 
        
        
        if is_valid and not stack:
            x += 1
    
    return x

 


 

💬 5. 풀이하면서 느낀 점

처음에는 문자열을 회전시키는 부분이 핵심이라고 생각했는데, 풀이를 정리하다 보니 실제로 중요한 부분은 각 회전 결과가 올바른 괄호 문자열인지 안정적으로 검증하는 과정이었습니다.

그래서 각 회전마다 stack을 새로 만들고, 닫는 괄호가 나올 때마다 직전 여는 괄호와 짝이 맞는지 확인하는 방식으로 풀었습니다. 조건이 맞지 않는 순간 바로 break하도록 처리해서 불필요한 검사를 줄일 수 있었습니다.

또한, 문자열을 매번 새로 만드는 대신 인덱스를 순환시키는 방식으로도 접근할 수 있다는 점을 이후에 생각해볼 수 있었습니다.

 

궁금하신 점이나 포스팅에 대한 피드백이 있다면 댓글로 편하게 남겨주세요.

도움이 되셨다면 공감이나 댓글 한 줄 남겨주시면 포스팅을 이어가는 데 큰 힘이 됩니다. 😊

'코딩테스트 > 알고리즘' 카테고리의 다른 글

[프로그래머스 LV.1] 완주하지 못한 선수 — Python 정답 & 해설  (0) 2026.06.22
[프로그래머스 LV.0] 문자열 밀기 — Python 정답 & 해설  (0) 2026.06.19
[프로그래머스 LV.0] 유한소수 판별하기 — Python 정답 & 해설  (1) 2026.06.13
[프로그래머스 LV.0] 배열 만들기 2 — Python 정답 & 해설  (0) 2026.06.11
[프로그래머스 LV.0] 배열 조각하기 — Python 정답 & 해설  (0) 2026.06.11
'코딩테스트/알고리즘' 카테고리의 다른 글
  • [프로그래머스 LV.1] 완주하지 못한 선수 — Python 정답 & 해설
  • [프로그래머스 LV.0] 문자열 밀기 — Python 정답 & 해설
  • [프로그래머스 LV.0] 유한소수 판별하기 — Python 정답 & 해설
  • [프로그래머스 LV.0] 배열 만들기 2 — Python 정답 & 해설
작지만 꾸준한 성장으로
작지만 꾸준한 성장으로
contact
  • 작지만 꾸준한 성장으로
    파랑새
    작지만 꾸준한 성장으로
  • 전체
    오늘
    어제
    • 분류 전체보기 (26)
      • IT (3)
      • 코딩테스트 (23)
        • 알고리즘 (12)
        • MYSQL (11)
      • 패션 (0)
      • 독후감 (0)
      • TIL (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Pandas pivot
    sql 코딩테스트
    파이썬코테
    파이썬
    모델 추론
    코테
    자바
    프로그래머스 lv.2
    Python
    프로그래머스 lv.0
    백준
    코딩테스트
    데이터 전처리 파이프라인
    Pandas melt
    python3
    데이터 리모델링
    Programmers
    프로그래머스 lv.1
    공공데이터 전처리
    Pandas groupby agg
    데이터베이스
    CPU Bound
    와이드 포맷 롱 포맷
    알고리즘
    I/O Bound
    wide format
    프로그래머스
    long format
    SWEA
    mysql
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
작지만 꾸준한 성장으로
[프로그래머스 LV.2] 괄호 회전하기 — Python 정답 & 해설
상단으로

티스토리툴바