코딩테스트 연습 - 단어 변환
두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다. 1. 한 번에 한 개의 알파벳만 바꿀 수
programmers.co.kr
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
|
def check_able_word(word1: str, word2: str):
count = 0
for i in range(len(word1)):
if word1[i] != word2[i]:
count += 1
if count == 2:
return False
return True
def solution(begin, target, words):
def dfs(cur_word, count, path):
if cur_word == target:
# print('도착 =', path, count)
# arrive_flag = True
flag[0] = True # 배열 인덱스 접근으로 할당하면 외부 변수 값을 컨트롤 할 수 있다.
result.append(count)
for check_word in words:
if check_able_word(cur_word, check_word) and check_word not in path:
dfs(check_word, count + 1, path + [check_word])
# arrive_flag = False # 파이썬 알고리즘 인터뷰 337p 재할당 오류
result = []
flag = [False]
dfs(begin, 0, [begin])
print(result)
if not flag[0]:
return 0
else:
return min(result)
|
cs |
DFS를 사용하여 풀었다. check_able_word()을 충족하는 단어가 없으면 False를 반환하기 때문에 재귀함수의 종료조건을 따로 구현하지 않았다. dfs()의 3번째 파라미터인 path를 통해 한번 사용한 단어들을 저장하기 때문에 한번 사용했던 단어를 만나면 다음 for문으로 넘어간다.
+
dfs()는 solution()의 중첩 함수이다. 중첩 함수는 바깥에서 선언한 부모 함수의 변수를 자유롭게 읽을 수 있다.
바깥에서 선언한 변수인 arrive_flag의 초기값은 False이고 target을 찾았을 경우 중첩 함수안에서 True로 변경하려 했다. 하지만 dfs안에서의 arrive_flag = True는 중첩 함수안에서만 사용되는 지역 변수이며 여기서 재할당된 값은 부모 함수에 있는 arrive_flag에 영향을 줄 수 없다.
이럴 경우 가변객체인 리스트(flag = [False])를 사용하여 변수를 조작하면 된다. 조작된 값은 부모함수에서도 그대로 적용된다.
'알고리즘 문제풀이 with 파이썬 > 프로그래머스' 카테고리의 다른 글
[구현] 예상 대진표 (0) | 2021.11.01 |
---|---|
[BFS] 게임 맵 최단거리 (0) | 2021.11.01 |
[그리디, 투 포인터] 구명보트 (0) | 2021.10.28 |
[구현] 프렌즈4블록 (0) | 2021.10.27 |
[DFS] 네트워크 (0) | 2021.10.10 |