프로그래머스 -> 코딩 테스트 연습 -> 깊이/너비 우선 탐색(DFS/BFS)에서
단어 변환에 대한 문제
python으로 BFS가 아닌 DFS를 이용해 문제를 풀었다.
두 개의 단어 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 함수를 작성해주세요.
제한사항
입출력 예
begin | target | words | return |
hit | cog | [hot, dot, dog, lot, log, cog] | 4 |
hit | cog | [hot, dot, dog, lot, log] | 0 |
입출력 예 설명
예제 #1
문제에 나온 예와 같습니다.
예제 #2
target인 cog는 words 안에 없기 때문에 변환할 수 없습니다.
begin 단어로 시작해서 target 단어까지 변환하는데 가장 짧은 루트(depth) 찾기
-> 각 depth에서 어느 경로의 탐색에서 제일 빨리 target 단어까지 변환되는지 찾아야 한다.
-> DFS 이용
전제조건
1. 각 단어의 모든 알파벳은 소문자로 이루어져 있다.
2. 모든 단어의 길이는 같다. (3 이상 10 이하)
3. 중복되는 단어는 없다.
단어 변환 조건
1. 한 번에 한 개의 알파벳만 바꿀 수 있다. -> 단어의 3 알파벳 중 하나만 다른 경우를 조건으로 건다.
2. words에 있는 단어로만 변환할 수 있다. -> target 단어가 words에 없으면 0을 반환한다.
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
31
32
33
34
35
36
37
38
|
answer = 0
def d fs(begin,target,words,visited):
global answer
stacks = [begin]
while stacks:
# 스택을 활용한 dfs 구현
stack = stacks.pop()
if stack == target:
return answer
for w in range(0,len(words)):
# 조건 1. 한 개의 알파벳만 다른 경우
if len([i for i in range(0,len(words[w])) if words[w][i]!=stack[i]]) == 1:
if visited[w] != 0:
continue
visited[w] = 1
# stack에 추가
stacks.append(words[w])
# depth +
answer +=1
def solution(begin, target, words):
global answer
# 조건 2. words에 있는 단어로만 변환할 수 있습니다.
if target not in words:
return 0
visited = [0 for i in words]
dfs(begin,target,words,visited)
return answer
|
cs |
알고리즘 정리 #1 - 최대공약수와 최소공배수 (0) | 2019.07.20 |
---|