Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
Tags
- LLM
- React
- monorepo
- build
- DP
- Algorithm
- heapq
- VectoreStore
- python
- OpenAI
- BFS
- dfs
- frontend
- Two Pointer
- ansible
- queue
- Infra
- turbo
- rag
- jenkins
- typescript
- AI
- javascript
- modbus
- 알고리즘
- 프로그래머스
- 파이썬
- javascirpt
- CI/CD
- docker
Archives
- Today
- Total
DM Log
[DFS/BFS] 단어 변환 - Python / JavaScript 본문
문제 링크 - https://school.programmers.co.kr/learn/courses/30/lessons/43163
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
[문제 간단 요약]
- 시작 단어(begin)를 목표 단어(target)으로 변환
- 변환 규칙:
- 한 번에 한 글자만 바꿀 수 있음
- 변환된 단어는 반드시 주어진 단어 목록(words)에 포함
- begin에서 target으로 변환하는 최소 단계 수를 반환
- 변환이 불가능한 경우 0 반환
[문제 해결 방안]
- 그래프 탐색 문제: 각 단어를 노드로 보고, 한 글자 차이 나는 단어끼리 연결
- DFS 또는 BFS로 탐색 가능
- DFS: 모든 경로 탐색 후 최소 단계 갱신
- BFS: 최단 경로 탐색에 더 직관적
- 본 풀이는 DFS로 구현
[문제 해결 코드 - python]
def chk_rule(pre_word, post_word):
cnt = 0
for i in range(len(pre_word)):
if pre_word[i] != post_word[i]:
cnt += 1
return cnt == 1
def dfs(begin, target, cnt, words):
global result, used
if begin == target:
result = min(result, cnt)
return
for idx in range(len(words)):
if chk_rule(begin, words[idx]) and used[idx] == 0:
used[idx] = 1
dfs(words[idx], target, cnt+1, words)
used[idx] = 0
return
def solution(begin, target, words):
global result, used
result = float('inf')
used = [0]*len(words)
dfs(begin, target, 0, words)
return result if result != float('inf') else 0
[코드 개선점]
- 비교 함수 최적화
두 단어의 차이가 2 이상이면 즉시 중단 → 성능 개선 - 전역 변수 제거
Python에서는 global result, used 대신 함수 인자로 넘겨주면 가독성 ↑ - DFS → BFS 대체 가능
최단 거리 문제이므로 BFS를 사용하면 더 직관적으로 해결 가능 - 복잡도 분석
- 단어 수: 최대 50
- 각 단어 길이: 최대 10
- 단어 비교 O(L), 전체 탐색 O(N²L) (N=단어 개수, L=단어 길이)
- 제한 범위 내에서 충분히 빠름
[코드 개선점 참고 문제 해결 코드 - javascript]
function chkRule(a, b) {
let diff = 0;
for (let i = 0; i < a.length; i++) {
if (a[i] !== b[i]) {
diff++;
if (diff > 1) return false;
}
}
return diff === 1;
}
function solution(begin, target, words) {
const visited = new Array(words.length).fill(false);
const queue = [[begin, 0]];
while (queue.length > 0) {
const [word, cnt] = queue.shift();
if (word === target) return cnt;
for (let i = 0; i < words.length; i++) {
if (!visited[i] && chkRule(word, words[i])) {
visited[i] = true;
queue.push([words[i], cnt + 1]);
}
}
}
return 0;
}'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [BFS] 미로탈출 - Python / JavaScript (0) | 2025.09.28 |
|---|---|
| [Heap] 야근 지수 - Python / JavaScript (0) | 2025.09.13 |
| [Heap] 이중우선순위큐 - Python (0) | 2025.09.13 |
| [DP] 정수 삼각형 - Python / JavaScript (0) | 2025.09.07 |
| [DFS] 네트워크 - Python / JavaScript (0) | 2025.09.06 |