Algorithm/ํ๋ก๊ทธ๋๋จธ์ค
[ํ๋ก๊ทธ๋๋จธ์ค / Python] ๋จ์ด ๋ณํ
meeeeejin
2021. 3. 31. 18:11
๋ฌธ์ ๋งํฌ: programmers.co.kr/learn/courses/30/lessons/43163
๋ฌธ์ ์ค๋ช
๊ฐ ๋จ์ด๊ฐ ํ ๊ธ์์ฉ๋ง ์ฐจ์ด ๋๋ ๊ฒฝ์ฐ(ex. hot๊ณผ hit) ๋จ์ด ๋ณํ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋จ์ด๋ค์ ์ ์ ๋ค๋ก, ๋ณํ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ์ผ๋ก ํ์ํด์ BFS๋ฅผ ์ด์ฉํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
- begin์ ํฌํจํด์ ๊ทธ๋ํ๋ฅผ ๋ง๋ค๊ธฐ ์ํด words์ begin ๋จ์ด๋ฅผ ์ฝ์
- ๊ทธ๋ํ๋ฅผ ํํํ๋ ์ธ์ ๋ฆฌ์คํธ ์ด๊ธฐํ
- ์ด๋ ๋ ๋จ์ด๊ฐ ์ ํํ "ํ ๊ธ์"๋ง ์ฐจ์ด ๋ ๊ฒฝ์ฐ ์ธ์ ํ ๊ฑธ๋ก ๊ฐ์ฃผ
- begin ๋จ์ด ๋ถํฐ BFS ์ํ
- ์ด๋ depth๋ begin๋ถํฐ ํ์ฌ ์ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ(๋ณํ ํ์)๋ฅผ ์๋ฏธ
- BFS ์ค์ target์ ๋๋ฌํ๋ฉด depth๋ฅผ return
์์ค์ฝ๋
from collections import deque
# word graph์ ์ธ์ ๋ฆฌ์คํธ ์ด๊ธฐํ
def init_graph(graph, words):
for i in range(len(words)):
for j in range(len(words)):
cnt = 0
for k in range(len(words[i])):
if words[i][k] != words[j][k]: # ๋ ๋จ์ด์ ๊ฐ ๊ธ์๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ
cnt += 1
if cnt > 1: # ๋ ๋จ์ด๊ฐ ํ ๊ธ์ ์ด์ ์ฐจ์ด ๋๋ ๊ฒฝ์ฐ
break
if cnt == 1:
graph[i].append(j)
def bfs(start, target, words):
graph = [[] for _ in range(len(words))]
init_graph(graph, words)
visited = [False] * len(words)
depth = [0] * len(words)
# BFS ์์
queue = deque([start])
visited[start] = True
while queue:
v = queue.popleft()
for x in graph[v]:
# ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ํ ์ ์ ๋ฐฉ๋ฌธ
if not visited[x]:
queue.append(x)
visited[x] = True
# ํ์ฌ ์ ์ ์ depth๋ ๋ถ๋ชจ ์ ์ ์ depth + 1
depth[x] = depth[v] + 1
# target์ ๋๋ฌํ์ ๊ฒฝ์ฐ
if words[x] == target:
return depth[x]
return 0 # target์ ๋๋ฌํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ
def solution(begin, target, words):
answer = 0
words.append(begin)
# begin์ ์ ์ผ ๋ค์ ์ฝ์
ํ์ผ๋ฏ๋ก begin์ ์ธ๋ฑ์ค๋ words์ ๋ง์ง๋ง ์ธ๋ฑ์ค
answer = bfs(len(words) - 1, target, words)
return answer
728x90