๐ฑ ๋ฌธ์
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๐ฑ ํ์ด
1. ํด๋น ๋จ์ด์์ ๋ฐ๊ฟ ์ ์๋ ๋จ์ด ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ (๊ทธ๋ํ ๋ง๋ค๊ธฐ)
BFS ํ์์ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํ์ฌ ์์น(ํ์ฌ ๋จ์ด)์์ ๊ฐ ์ ์๋(ํ๊ธ์ ๋ฐ๊ฟ ์ ์๋) ์์น๋ฅผ ๋ด์ ๋ฆฌ์คํธ(๋ ธ๋๊ฐ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ๋ด์ ๊ทธ๋ํ)๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋จ์ด ๋ฆฌ์คํธ๊ฐ hot, dot, dog, log, log, cog์ผ ๋, ๊ทธ๋ํ์๋ ์๋์ ๊ฐ์ด ์ ์ฅ๋์ด์ผ ํฉ๋๋ค.
# ํด๋น ๋จ์ด์์ ๊ฐ ์ ์๋ ๋จ์ด ์ ๋ณด ์ ์ฅ (๊ทธ๋ํ ๋ง๋ค๊ธฐ)
for i in range(len(words)):
word1 = words[i]
for j in range(len(words) - i - 1):
word2 = words[i + j + 1]
if len([ch for idx, ch in enumerate(word2) if ch != word1[idx]]) == 1:
graph[i].append(i + j + 1)
graph[i + j + 1].append(i)
- ๋จ์ด๋ฅผ ํ๋ํ๋์ฉ ๋น๊ตํด๊ฐ๋ฉด์ ์ธ๋ฑ์ค๋ง๋ค ๋น๊ตํ์ ๋ ์ผ์นํ์ง ์๋ ๊ธ์์ ๊ฐ์๊ฐ 1๊ฐ์ธ ๋จ์ด์ ์ธ๋ฑ์ค์ ์ถ๊ฐํฉ๋๋ค. ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์ด๋ฏ๋ก ์์ชฝ ๋ชจ๋ ์ถ๊ฐํด์ค๋๋ค.
2. ์์์ ์ฐพ๊ธฐ
ํ์์ ์์ํ ์์์ ์ ์์์ ๊ทธ๋ํ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ๊ณผ ๋์ผํฉ๋๋ค. begin
์ผ๋ก ์ฃผ์ด์ง ๋จ์ด์ ๋ชจ๋ ๋จ์ด๋ฅผ ๋น๊ตํ๋ฉด์ begin
๊ณผ ํ๊ธ์๋ง ๋ค๋ฅธ ๋จ์ด์ ์ธ๋ฑ์ค๋ฅผ start
๋ฆฌ์คํธ์ ์ถ๊ฐํฉ๋๋ค.
for i in range(len(words)):
word1 = words[i]
if len([ch for idx, ch in enumerate(begin) if ch != word1[idx]]) == 1:
start.append(i)
3. BFS ํ์ํ๊ธฐ
for s in start:
answer.append(bfs(graph, s))
def bfs(graph, s):
queue = deque()
visited = [False for _ in range(len(words))]
queue.append((s, 1))
visited[s] = True
while queue:
v, step = queue.popleft()
if words[v] == target:
return step
for i in graph[v]:
if visited[i] == False:
queue.append((i, step + 1))
visited[i] = True
start
์ ์ ์ฅํด๋์ ๋จ์ด์ ์ธ๋ฑ์ค๋ค์ ํ๋์ฉ ๋๋ฉด์ BFS ํ์์ ํฉ๋๋ค.- BFS ํ์์ ํ ๋์
queue
์ ๊ธ์๊ฐ ๋ฐ๋ ํ์๋ฅผ ํจ๊ป ๋๊ฒจ์ค๋๋ค. queue
์์ ๊บผ๋ธ ๋จ์ด๊ฐtarget
๊ณผ ๊ฐ๋ค๋ฉด ํ์ฌ๊น์ง ๊ธ์๋ฅผ ๋ฐ๊พผ ํ์(step
)์ ๋ฆฌํดํฉ๋๋ค.
๐ฑ ์ ๋ต
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# programmers ๋จ์ด ๋ณํ
from collections import deque
def solution(begin, target, words):
answer = []
graph = [[] for _ in range(len(words))]
start = []
if target not in words:
return 0
def bfs(graph, s):
queue = deque()
nonlocal words
visited = [False for _ in range(len(words))]
queue.append((s, 1))
visited[s] = True
while queue:
v, step = queue.popleft()
if words[v] == target:
return step
for i in graph[v]:
if visited[i] == False:
queue.append((i, step + 1))
visited[i] = True
# ํด๋น ๋จ์ด์์ ๊ฐ ์ ์๋ ๋จ์ด ์ ๋ณด ์ ์ฅ (๊ทธ๋ํ ๋ง๋ค๊ธฐ)
for i in range(len(words)):
word1 = words[i]
for j in range(len(words) - i - 1):
word2 = words[i + j + 1]
if len([ch for idx, ch in enumerate(word2) if ch != word1[idx]]) == 1:
graph[i].append(i + j + 1)
graph[i + j + 1].append(i)
if len([ch for idx, ch in enumerate(begin) if ch != word1[idx]]) == 1:
start.append(i)
for s in start:
answer.append(bfs(graph, s))
if min(answer) == None:
return 0
return min(answer)
๋๊ธ