🔗 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 |