1. 문제 정보
https://school.programmers.co.kr/learn/courses/30/lessons/43163
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
- 난이도: Lv.3
2. 문제 설명
두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다.
1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다.
2. words에 있는 단어로만 변환할 수 있습니다.
예를 들어 begin이 "hit", target가 "cog", words가 ["hot","dot","dog","lot","log","cog"]라면 "hit" -> "hot" -> "dot" -> "dog" -> "cog"와 같이 4단계를 거쳐 변환할 수 있습니다.
두 개의 단어 begin, target과 단어의 집합 words가 매개변수로 주어질 때, 최소 몇 단계의 과정을 거쳐 begin을 target으로 변환할 수 있는지 return 하도록 solution 함수를 작성해주세요.
제한 조건
- 각 단어는 알파벳 소문자로만 이루어져 있습니다.
- 각 단어의 길이는 3 이상 10 이하이며 모든 단어의 길이는 같습니다.
- words에는 3개 이상 50개 이하의 단어가 있으며 중복되는 단어는 없습니다.
- begin과 target은 같지 않습니다.
- 변환할 수 없는 경우에는 0를 return 합니다.
3. 접근 기준
한 번에 한 글자씩만 변경할 수 있고, 각 변환은 동일한 비용을 가진다.
begin에서 target까지의 최소 변환 횟수를 구하는 최단 경로 문제로 접근한다
4. 사용한 패턴 / 알고리즘
- BFS (너비 우선 탐색)
- 모든 변환 비용이 동일
- 가장 먼저 도달한 경로가 최단 경로
"단계별로 확장하며 가장 먼저 target에 도달하는 경로를 찾는 방식”
5. 핵심 아이디어
- 현재 단어에서 한 글자만 다른 단어를 다음 단계로 탐색
- words에 존재하는 단어만 이동 가능
- BFS를 통해 단계별로 탐색하며 target 도달 시 즉시 종료
- 방문한 단어는 재사용하지 않도록 관리
6. 풀이 코드
초기코드
def solution(begin, target, words): answer = [] visited = [False]*len(words) def dfs(ans, cnt): nonlocal answer if ans == target: answer.append(cnt) return for i in range(len(words)): if not visited[i]: visited[i] =True diff = 0 for j in range(len(ans)): if diff>1: break elif ans[j] != words[i][j]: diff+=1 if diff == 1: dfs(words[i],cnt+1) visited[i] = False dfs(begin,0) return min(answer) if answer else 0
최적화 코드
from collections import deque def solution(begin, target, words): if target not in words: return 0 def can_change(a, b): diff = 0 for i in range(len(a)): if a[i] != b[i]: diff += 1 if diff > 1: return False return diff == 1 queue = deque([(begin, 0)]) visited = [False] * len(words) while queue: word, cnt = queue.popleft() if word == target: return cnt for i in range(len(words)): if not visited[i] and can_change(word, words[i]): visited[i] = True queue.append((words[i], cnt + 1)) return 0
7. 핵심 로직 요약
- 현재 단어에서 한 글자만 다른 단어를 찾아 다음 단계로 이동
- BFS로 단계별 탐색하며 target 도달 시 즉시 종료
- 방문한 단어는 재사용하지 않도록 관리
8. 개선점
- 초기 코드는 DFS로 모든 경우를 탐색하면서 가능한 경로를 answer 리스트에 저장한 뒤 최소값을 구하는 방식이었다. 이로 인해 불필요한 경로까지 모두 탐색하게 되어 시간 비효율이 발생했다.
- 또한 단어 비교 로직을 can_change 함수로 분리하여 코드 가독성을 높이고, 동일한 비교 연산을 재사용할 수 있도록 개선했다.
- 이를 개선하기 위해 BFS로 변경하여 가장 먼저 도달한 경로를 즉시 반환하도록 구조를 수정했다. 이를 통해 전체 탐색 없이도 최단 경로를 구할 수 있게 되었다.
'CodingTest > 문제 풀이(Lv3)' 카테고리의 다른 글
| 프로그래머스 Lv.3 | Python | 등굣길 (0) | 2026.04.12 |
|---|---|
| 프로그래머스 Lv.3 | Python | 여행경로 (0) | 2026.04.09 |
| 프로그래머스 Lv.3 | Python | 네트워크 (0) | 2026.04.08 |
| 프로그래머스 Lv.3 | Python | 가장 먼 노드 (0) | 2026.04.08 |
| 프로그래머스 Lv.3 | Python | 이중우선순위큐 (0) | 2026.04.04 |