🔗 1. 문제 URL
https://school.programmers.co.kr/learn/courses/30/lessons/120921
📝 2. 문제 요구사항 정리
문자열 A와 B가 주어졌을 때, A를 오른쪽으로 몇 번 밀어야 B가 되는지 구하는 문제입니다. 만들 수 있다면 필요한 최소 횟수를 반환하고, 어떤 방식으로 밀어도 B가 될 수 없다면 -1을 반환해야 합니다.
- 입력: 길이가 같은 두 문자열 A, B가 주어집니다.
- 처리: A를 오른쪽으로 회전시켜 B와 같아질 수 있는지 확인합니다.
- 반환값: 가능하면 최소 회전 횟수, 불가능하면 -1을 반환합니다.
💡 3. 핵심 개념
✔ 1) 회전 문자열의 특징 이해하기
문자열을 오른쪽으로 밀어 만든 결과들은 원래 문자열의 순환된 형태입니다. 예를 들어 B를 두 번 이어 붙인 B + B 안에는 B에서 시작할 수 있는 모든 순환 형태가 연속된 부분 문자열로 들어 있습니다.
✔ 2) B + B에서 A의 위치 찾기
A를 오른쪽으로 밀어 B를 만들 수 있다는 것은, 반대로 보면 A가 B + B 안에 부분 문자열로 존재한다는 뜻입니다. 이때 A가 처음 등장하는 위치가 A를 오른쪽으로 밀어야 하는 최소 횟수가 됩니다.
✔ 3) find()의 반환값 활용하기
Python의 find()는 찾는 문자열이 있으면 시작 인덱스를 반환하고, 없으면 -1을 반환합니다. 문제에서 요구하는 반환값과 정확히 맞아떨어지기 때문에 별도의 조건문 없이 그대로 사용할 수 있습니다.
✅ 4. 정답 Python 코드
def solution(A, B):
# B를 두 번 더한 문자열에서 A의 시작 위치를 찾음
return (B + B).find(A)
💬 5. 풀이하면서 느낀 점
처음에는 A를 한 칸씩 직접 밀면서 B와 같은지 확인하는 방식으로 풀 수 있다고 생각했습니다. 그런데 풀이를 정리하다 보니, 회전 문자열은 두 번 이어 붙인 문자열 안에서 부분 문자열로 확인할 수 있다는 점을 활용하면 훨씬 간단하게 풀 수 있었습니다.
그래서 B + B에서 A가 처음 등장하는 위치를 찾는 방식으로 구현했습니다. find()가 문자열을 찾지 못하면 -1을 반환해 주기 때문에, 문제의 예외 처리까지 자연스럽게 해결되는 점이 깔끔하다고 느꼈습니다.
또한, deque를 이용해 직접 회전시키며 비교하는 방식으로도 접근할 수 있지만, 이번 문제에서는 문자열의 순환 구조를 이용하는 방식이 더 간결하다는 점을 이후에 생각해볼 수 있었습니다.
궁금하신 점이나 포스팅에 대한 피드백이 있다면 댓글로 편하게 남겨주세요.
도움이 되셨다면 공감이나 댓글 한 줄 남겨주시면 포스팅을 이어가는 데 큰 힘이 됩니다. 😊
'코딩테스트 > 알고리즘' 카테고리의 다른 글
| [프로그래머스 LV.0] 등수 매기기 — Python 정답 & 해설 (0) | 2026.06.22 |
|---|---|
| [프로그래머스 LV.1] 완주하지 못한 선수 — Python 정답 & 해설 (0) | 2026.06.22 |
| [프로그래머스 LV.2] 괄호 회전하기 — Python 정답 & 해설 (0) | 2026.06.16 |
| [프로그래머스 LV.0] 유한소수 판별하기 — Python 정답 & 해설 (1) | 2026.06.13 |
| [프로그래머스 LV.0] 배열 만들기 2 — Python 정답 & 해설 (0) | 2026.06.11 |