https://school.programmers.co.kr/learn/courses/30/lessons/43163
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก์ Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
2026.04.01
zip ํจ์ ์ฌ์ฉ์ด ์ฌ์ ํ ๋ฏธ์ํ๊ณ ,,
bfs ์์ฒด ๊ตฌํ์ ๋์์ง ์๊ฒ ํ๋ค. visited๊ฐ ์งํฉ์ด ๋ ์ ์๋ค๋๊ฑด ๋ชฐ๋์ง๋ง
(bfs๋ 1. queue ๊ตฌํ 2. visited ์ ์ 3. while 4. popleft 5. ์ข ๋ฃ์กฐ๊ฑด 6. ์ธ์ ํ ๋ ธ๋ 7. ์กฐ๊ฑด ๋ง์กฑํ๋ฉด queue์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ)
from collections import deque
# ํ ๋จ์ด๋ง ๋ค๋ฅธ์ง ์ฒดํฌํ๋ ํจ์
def validate(w1, w2):
# if w1 == w2:
# return False
# diff = 0
# for i in range(len(w1)):
# if w1[i] != w2[i]: # ํ ๋จ์ด์ฉ ๋น๊ตํ๊ธฐ
# diff += 1
# if diff > 1: # ์ด๋ฏธ ๋ ๋จ์ด ์ด์์ด ๋ค๋ฅด๋ฉด ๋ ๋์ง ๋ง๊ณ ๋๋ด๊ธฐ
# break
# return (diff == 1)
return sum(a != b for a, b in zip(w1,w2)) == 1
# ์์ ๋จ์ด๋ก๋ถํฐ ๊ฐ ์ ์๋ ๋ค๋ฅธ ๋จ์ด ์ฐพ๊ธฐ
def curr_to_next(curr,words):
next_list = []
for i in range(len(words)):
if validate(curr, words[i]):
next_list.append(words[i])
return next_list
def bfs(begin,target,words):
queue = deque([(begin,0)])
visited = set()
while queue:
word, cnt = queue.popleft()
# ์ข
๋ฃ ์กฐ๊ฑด
if word == target:
return cnt
for next_word in curr_to_next(word, words):
if next_word not in visited: # ์ฌ์ฉํ๋ ๋จ์ด๊ฐ ์๋๋ฉด
queue.append((next_word,cnt+1))
visited.add(next_word) # ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
return 0 # 2. ์ค๊ฐ ์ฐ๊ฒฐ ๋ค๋ฆฌ๊ฐ ์์ ๋
def solution(begin,target,words):
# begin -> target์ผ๋ก์ ์ต๋จ๊ฑฐ๋ฆฌ
# ๋ณํํ ์ ์์ ๋๋ 0์ return
# 1. words ์์ taget์ด ์์ ๋
# 2. ์ค๊ฐ ์ฐ๊ฒฐ ๋ค๋ฆฌ๊ฐ ์์ ๋
# [๊ตฌํ ๋ฐฉ๋ฒ]
# begin ๋จ์ด๋ก๋ถํฐ ๊ฐ ์ ์๋ ๋ชจ๋ ๊ฒฝ๋ก๋ก ๊ฐ์ผ ํจ (bfs)
# ๊ทธ ์ค์ ์ข
๋ฃ์กฐ๊ฑด์ด target์ด๋ ๊ฐ์ ๋ ๋ฉ์ถ๋ ๊ฒ
if target not in words:
return 0 # 1. words ์์ taget์ด ์์ ๋
return bfs(begin,target,words)
from collections import deque
def near_words(a, b):
different = 0
for i in range(len(a)):
if a[i] != b[i]:
different += 1
if different == 1:
return True
else:
return False
def make_graph(graph, begin, words):
for i in range(len(words)):
if near_words(begin, words[i]):
graph[0].append(i+1)
for i in range(len(words)):
for j in range(i+1, len(words)):
if near_words(words[i], words[j]):
graph[i+1].append(j+1);graph[j+1].append(i+1)
def bfs(graph, begin_idx, target_idx, visited):
queue = deque()
queue.append((begin_idx,0))
visited[begin_idx] = True
while queue:
v, cnt = queue.popleft()
if v == target_idx:
return cnt
for next_v in graph[v]:
if not visited[next_v]:
queue.append((next_v, cnt+1))
visited[next_v] = True
return 0
def solution(begin, target, words):
if target not in words:
return 0
graph = [[] for _ in range(len(words)+1)]
make_graph(graph, begin, words)
visited = [False] * (len(words)+1)
answer = bfs(graph, 0, words.index(target)+1, visited)
return answer
๋ณต์กํ๊ฒ ํผ ์ด์
(1) zip ํจ์๋ฅผ ๊น๋จน์
(2) idx์ฒ๋ฆฌ ๋ฐฉ๋ฒ๋ฐ์ ๋ชฐ๋ผ์ ๊ทธ๋ํ ์ํํ๋ ค๊ณ ํ๋๋ฐ, ์งํฉ ์ด์ฉํ๋ฉด ์ฝ๊ฒ ํด๊ฒฐ๋ ๋ฌธ์ ์์
from collections import deque
def near_words(a, b):
diff = sum(1 for x,y in zip(a,b) if x!=y)
return diff == 1
def solution(begin, target, words):
if target not in words:
return 0
queue = deque([(begin,0)])
visited = set()
while queue:
word, cnt = queue.popleft()
if word == target:
return cnt
for next_word in words:
if next_word not in visited and near_words(word,next_word):
queue.append((next_word,cnt+1))
visited.add(next_word)'๐ Study > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ํ๋ก๊ทธ๋๋จธ์ค | dfs/bfs | ํ๊ฒ ๋๋ฒ (0) | 2025.10.09 |
|---|---|
| ํ๋ก๊ทธ๋๋จธ์ค Lv3 | dfs/bfs | ์ฌํ๊ฒฝ๋ก (0) | 2025.10.09 |
| ํ๋ก๊ทธ๋๋จธ์ค | dfs/bfs | ๋คํธ์ํฌ (0) | 2025.10.09 |
| ํ๋ก๊ทธ๋๋จธ์ค | ํ์๋ฒ | ๊ตฌ๋ช ๋ณดํธ (0) | 2025.10.08 |
| [Bronze I] 9093 - ๋จ์ด ๋ค์ง๊ธฐ (1) | 2025.07.20 |