[Programmers] 단어 변환(DFS)

DDANDARA ㅣ 2020. 9. 23. 00:53

https://programmers.co.kr/learn/courses/30/lessons/43163

 

코딩테스트 연습 - 단어 변환

두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다. 1. 한 번에 한 개의 알파벳만 바꿀 수

programmers.co.kr

문제 설명

두 개의 단어 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 합니다.

입출력 예

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 안에 없기 때문에 변환할 수 없습니다.

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
'''
프로그래머스 - DFS - 단어 변환
    처음에는 최소를 구하는거라 BFS를 생각했지만, 시작단어마다 visited가 다르기 때문에
    백트래킹을 사용하였다. 자바와 달리 전역변수의 변경이 불가능하니 리턴을 이용하자
'''
 
# 현재 단어와 한 글자만 다른 단어 추출 함수
def isSimilar(word1, word2):
    cnt = 0
    for i in range(len(word1)):
        if word1[i] == word2[i]:
            cnt += 1
    if cnt == len(word1) - 1:
        return True
    else:
        return False
 
def solution(begin, target, words):
    #visited 리스트 선언
    visited = [False for _ in range(len(words))]
    answer = 1e9
    def dfs(cur, cnt, answer):
        # 현재 단어가 target과 같다면
        if cur == target:
            # 최소값 비교 후 저장
            answer = min(answer, cnt)
            return answer
        else:
            # words 배열 순회
            for i in range(len(words)):
                candi = words[i]
                # 후보 단어가 존재하고
                if isSimilar(cur, candi):
                    # 그 단어를 아직 방문 전이라면
                    if not visited[i]:
                        # 백트래킹 -> 이번 스텝의 횟수가 이미 최소 answer를 넘어가면 바로 전으로 넘어감
                        if cnt+1 >= answer:
                            pass
                        else:
                            visited[i] = True
                            answer = dfs(candi, cnt+1, answer)
                            visited[i] = False
            return answer
    answer = dfs(begin, 0, answer)
    if answer == 1e9:
        answer = 0
    return answer
 
begin = "hit"
target = "cog"
words = ["hot""dot""dog""lot""log"]
solution(begin,target,words)
cs

 

'알고리즘' 카테고리의 다른 글

[Programmers] 정수 삼각형(DP)  (0) 2020.09.23
[Programmers] 여행경로(DFS)  (0) 2020.09.23
[Programmers] 디스크 컨트롤러(HEAP)  (0) 2020.09.22
[Programmers] 더 맵게(HEAP)  (0) 2020.09.22
[Programmers] - 가장 큰 수(정렬)  (0) 2020.09.21