์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- spring
- ์ฝ๋ฉํ ์คํธ
- ๋จ์ํ ์คํธ
- ChatGPT
- ์ปดํจํฐ๊ณตํ
- ๋ชจ๋ฐ์ผ์ฑํ๋ก๊ทธ๋๋ฐ
- ๊ทธ๋ฆฌ๋์๊ณ ๋ฆฌ์ฆ
- ํ๋ก ํธ์ค๋
- ์ฐ์ ์์ํ
- ์ฝ๋ฉ
- ๋ฐฑ์๋
- ๋ฐฑ์คํ์ด
- ๋ฆฌ์กํธ๋ค์ดํฐ๋ธ
- ์๊ณ ๋ฆฌ์ฆ
- ์น๊ฐ๋ฐ๊ธฐ๋ก
- ์ปด๊ณต
- ์ดํญ๊ณ์
- ์คํ๋ง
- ๋ฐฑ์ค1436
- boj11653
- ๋ฆฌ์กํธ
- ํ๋ก๊ทธ๋๋ฐ
- ์ปด๊ณต์
- ํ์ด์ฌ
- SSE
- ๊ฐ๋ฐ์
- ์น๊ฐ๋ฐ
- ์๋ฃ๊ตฌ์กฐ
- ๋ฐฑ์ค
- ๊ทธ๋ฆฌ๋
- Today
- Total
๐ป๐ญ๐ง๐
DFS & BFS ์๊ณ ๋ฆฌ์ฆ ๋ณธ๋ฌธ
๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ : DFS / BFS
ํ์(search) ์ด๋? : ๋ง์ ์์ ๋ฐ์ดํฐ ์ค์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ณผ์
- ๋ํ์ ์ธ ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก๋ DFS์ BFS๊ฐ ์์
- DFS/BFS๋ ์ฝ๋ฉํ ์คํธ์์ ๋งค์ฐ ์์ฃผ ๋ฑ์ฅํ๋ ์ ํ
์คํ ์๋ฃ๊ตฌ์กฐ
- ๋จผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๊ฐ ๋์ค์ ๋๊ฐ๋ ํ์(์ ์ ํ์ถ)์ ์๋ฃ๊ตฌ์กฐ
- ์ ๊ตฌ์ ์ถ๊ตฌ๊ฐ ๋์ผํ ํํ๋ก ์คํ์ ์๊ฐํํ ์ ์์
- '์ฝ์ ' ๊ณผ '์ญ์ ' ๋ ์ฐ์ฐ์ผ๋ก ์ด๋ฃจ์ด์ง
<์คํ ๊ตฌํ ์์ >
stack = []
#์ฝ์
(5) - ์ฝ์
(2) - ์ฝ์
(3) - ์ฝ์
(7) - ์ญ์ () - ์ฝ์
(1) - ์ฝ์
(4) - ์ญ์ ()
stack.append(5)
stack.append(2)
stack.append(3)
stack.append(7)
stack.pop()
stack.append(1)
stack.append(4)
stack.pop()
print(stack[::-1]) #์ต์๋จ์์๋ถํฐ ์ถ๋ ฅ
print(stack) # ์ตํ๋จ ์์๋ถํฐ ์ถ๋ ฅ
→ append() ์ pop() ์ ์๊ฐ๋ณต์ก๋๋ O(1) ์ด๋ฏ๋ก ์ฌ์ฉํ๊ธฐ์ ์ข์
→ ํ์ด์ฌ์์๋ ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ํ์์์ด ์คํ ๊ตฌํ ๊ฐ๋ฅ
ํ ์๋ฃ๊ตฌ์กฐ
- ๋จผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ๋๊ฐ๋ ํ์(์ ์ ์ ์ถ)์ ์๋ฃ๊ตฌ์กฐ
- ํ๋ ์ ๊ตฌ์ ์ถ๊ตฌ๊ฐ ๋ชจ๋ ๋ซ๋ ค ์๋ ํฐ๋๊ณผ ๊ฐ์ ํํ๋ก ์๊ฐํ ํ ์ ์์.
- ์ผ์ข ์ ๋๊ธฐ์ด
<ํ ๊ตฌํ ์์ >
from collections import deque
# ํ(Queue) ๊ตฌํ์ ์ํด deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
queue = deque()
# ์ฝ์
(5) - ์ฝ์
(2) - ์ฝ์
(3) - ์ฝ์
(7) - ์ญ์ () - ์ฝ์
(1) - ์ฝ์
(4) - ์ญ์ ()
queue.append(5)
queue.append(2)
queue.append(3)
queue.append(7)
queue.popleft()
queue.append(1)
queue.append(4)
queue.popleft()
print(queue) # ๋จผ์ ๋ค์ด์จ ์์๋๋ก ์ถ๋ ฅ
queue.reverse() # ์ญ์์ผ๋ก ๋ฐ๊พธ๊ธฐ
print(queue) # ๋์ค์ ๋ค์ด์จ ์์๋ถํฐ ์ถ๋ ฅ
- ํ๋ฅผ ๊ตฌํํ ๋๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์๊ฐ๋ณต์ก๋๊ฐ ๋ฎ์ ์ข์.
- ์ค๋ฅธ์ชฝ์ผ๋ก ๋ค์ด์ ์ผ์ชฝ์ ๋๊ฐ๋ ํํ
์ฌ๊ท ํจ์(Recursive Function)๋? ์๊ธฐ ์์ ์ ๋ค์ ํธ์ถํ๋ ํจ์
- ํ์ ์ ์ฌํจ
<์ฌ๊ท ํจ์ ์์ >
def recursive_function():
print('์ฌ๊ท ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.')
recursive_function()
recursive_function()
- ํ์ด์ฌ์ ์ฌ๊ท ๊น์ด ์ ํ์ ๋์ง ์์ผ๋ฉด error (์ต๋ ์ฌ๊ท ๊น์ด ์ด๊ณผ ๋ฉ์์ง) ๋ฐ์
<์ข ๋ฃ ์กฐ๊ฑด์ ํฌํจํ ์ฌ๊ท ํจ์ ์์ >
def recursive_function(i):
#100๋ฒ์งธ ํธ์ถ์ ํ์ ๋ ์ข
๋ฃ๋๋๋ก ์ข
๋ฃ ์กฐ๊ฑด ๋ช
์
if i == 100:
return
print(i,'๋ฒ์งธ ์ฌ๊ทํจ์์์', i+1, '๋ฒ์งธ ์ฌ๊ทํจ์๋ฅผ ํธ์ถํฉ๋๋ค.')
recursive_function(i+1)
print(i,'๋ฒ์งธ ์ฌ๊ทํจ์๋ฅผ ์ข
๋ฃํฉ๋๋ค.')
recursive_function(1)
- ์๋ํด์ ๋ฌดํ ๋ฃจํ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ด ์๋๋ผ๋ฉด ๋ฌธ์ ํ์ด์์ ์ฌ์ฉํ ๋๋ ์ฌ๊ท ํจ์์ ์ข ๋ฃ ์กฐ๊ฑด์ ๋ฐ๋์ ๋ช ์ํด์ผ ํจ.
<ํฉํ ๋ฆฌ์ผ ๊ตฌํ ์์ >
#๋ฐ๋ณต์ ์ผ๋ก ๊ตฌํํ n!
def factorial_iterative(n):
result = 1
# 1๋ถํฐ n๊น์ง์ ์๋ฅผ ์ฐจ๋ก๋๋ก ๊ณฑํ๊ธฐ
for i in range(1, i+1):
result *= i
return result
# ์ฌ๊ท์ ์ผ๋ก ๊ตฌํํ n!
def factorial_recursive(n):
if n<=1: # n์ด 1 ์ดํ์ธ ๊ฒฝ์ฐ 1์ ๋ฐํ
return 1
# n! = n * (n-1)! ๋ฅผ ๊ทธ๋๋ก ์ฝ๋๋ก ์์ฑํ๊ธฐ
return n * factorial_recursive(n-1)
# ๊ฐ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌํํ n! ์ถ๋ ฅ(n=5)
print('๋ฐ๋ณต์ ์ผ๋ก ๊ตฌํ:',factorial_iterative(5))
print('์ฌ๊ท์ ์ผ๋ก ๊ตฌํ:',factorial_recursice(5))
<์ต๋๊ณต์ฝ์ ๊ณ์ฐ(์ ํด๋ฆฌ๋ ํธ์ ๋ฒ) ์์ >
- ๋ ์์ฐ์ A,B์ ๋ํ์ฌ (A>B) A๋ฅผ B๋ก ๋๋ ๋๋จธ์ง๋ฅผ R์ด๋ผ๊ณ ํ์.
- ์ด๋ A์ B์ ์ต๋๊ณต์ฝ์๋ B์ R์ ์ต๋๊ณต์ฝ์์ ๊ฐ๋ค.
def gcd(a, b):
if a%b == 0:
return b
else:
return gcd(b, a%b)
print(gcd(192,162))
→ a์ b์ ํฌ๊ธฐ์ ์๊ด์์ด ๋ณ์์ ๋ฃ์ผ๋ฉด ๋จ
โป ์ ์ ์ฌํญ
- ์ฌ๊ท ํจ์๋ฅผ ์ ํ์ฉํ๋ฉด ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์์
- ๋ค๋ฅธ ์ฌ๋์ด ์ดํดํ๊ธฐ ์ด๋ ค์ด ํํ์ ์ฝ๋๊ฐ ๋ ์๋ ์์
- ๋ชจ๋ ์ฌ๊ท ํจ์๋ ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํ์ฌ ๋์ผํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์
- ์ปดํจํฐ๊ฐ ํจ์๋ฅผ ์ฐ์์ ์ผ๋ก ํธ์ถํ๋ฉด ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ ๋ด๋ถ์ ์คํ ํ๋ ์์ ์์ → ๊ทธ๋์ ์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์ ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์
DFS (Depth-First Search)
- DFS๋ ๊น์ด ์ฐ์ ํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฆ
- DFS๋ ์คํ ์๋ฃ๊ตฌ์กฐ (or ์ฌ๊ท ํจ์)๋ฅผ ์ด์ฉํจ.
- ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ์คํ์ ์ต์๋จ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ํ ๋ ธ๋๊ฐ ํ๋๋ผ๋ ์์ผ๋ฉด ๊ทธ ๋ ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์คํ์์ ์ต์๋จ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
- ๋ ์ด์ 2๋ฒ์ ๊ณผ์ ์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
<DFS ์์ค์ฝ๋ ์์ >
#DFS ๋ฉ์๋ ์ ์
def dfs(graph, v, visited):
# ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited[v] = True
print(v, end='')
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋
ธ๋๋ฅผ ์ฌ๊ท์ ์ ๋ฐฉ๋ฌธ
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
#๊ฐ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ํํ (2์ฐจ์ ๋ฆฌ์คํธ)
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
# ๊ฐ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ๋ ์ ๋ณด๋ฅผ ํํ (1์ฐจ์ ๋ฆฌ์คํธ)
visited = [False] * 9
# ์ ์๋ DFS ํจ์ ํธ์ถ
dfs(graph, 1, visited)
BFS (Breadth-First Search)
- BFS๋ ๋๋น ์ฐ์ ํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฆ
- BFS๋ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํจ
- ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ํ์์ ๋ ธ๋๋ฅผ ๊บผ๋ธ ๋ค์ ํด๋น ๋ ธ๋์ ์ธ์ ๋ ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ๋ค.
- ๋ ์ด์ 2๋ฒ์ ๊ณผ์ ์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
→ ๊ฐ ๊ฐ์ ์ ๋น์ฉ์ด ๋ชจ๋ ๋์ผํ ์ํฉ์์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๊ธฐ๋ ํจ
<BFS ์์ค์ฝ๋ ์์ >
from collections import deque
# BFS ๋ฉ์๋ ์ ์
def bfs(graph, start, visited):
# ํ(Queue) ๊ตฌํ์ ์ํด deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
queue = deque([start])
# ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited[start] = True
#ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
while queue:
# ํ์์ ํ๋์ ์์๋ฅผ ๋ฝ์ ์ถ๋ ฅํ๊ธฐ
v = queue.popleft()
print(v, end='')
# ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ํ ์์๋ค์ ํ์ ์ฝ์
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
# ๊ฐ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ํํ (2์ฐจ์ ๋ฆฌ์คํธ)
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
# ๊ฐ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ๋ ์ ๋ณด๋ฅผ ํํ (1์ฐจ์ ๋ฆฌ์คํธ)
visited = [False] * 9
# ์ ์๋ BFS ํจ์ ํธ์ถ
bfs(graph, 1, visited)
<๋ฌธ์ 1> ์๋ฃ์ ์ผ๋ ค ๋จน๊ธฐ
- N x M ํฌ๊ธฐ์ ์ผ์ ํ์ด ์๋ค. ๊ตฌ๋ฉ์ด ๋ซ๋ ค ์๋ ๋ถ๋ถ์ 0, ์นธ๋ง์ด๊ฐ ์กด์ฌํ๋ ๋ถ๋ถ์ 1๋ก ํ์๋๋ค. ๊ตฌ๋ฉ์ด ๋ซ๋ ค ์๋ ๋ถ๋ถ๋ผ๋ฆฌ ์, ํ, ์ข, ์ฐ๋ก ๋ถ์ด ์๋ ๊ฒฝ์ฐ ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค. ์ด๋ ์ผ์ ํ์ ๋ชจ์์ด ์ฃผ์ด์ก์ ๋ ์์ฑ๋๋ ์ด ์์ด์คํฌ๋ฆผ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ. ๋ค์์ 4 x 5 ์ผ์ ํ ์์์์๋ ์์ด์คํฌ๋ฆผ์ด ์ด 3๊ฐ ์์ฑ๋๋ค.
- 00110
- 00010
- 11111
- 00000
<๋ฌธ์ ํด๊ฒฐ>
- ํน์ ํ ์ง์ ์ ์ฃผ๋ณ ์, ํ, ์ข, ์ฐ๋ฅผ ์ดํด๋ณธ ๋ค์ ์ฃผ๋ณ ์ง์ ์ค์์ ๊ฐ์ด '0'์ด๋ฉด์ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ง์ ์ด ์๋ค๋ฉด ํด๋น ์ง์ ์ ๋ฐฉ๋ฌธํ๋ค.
- ๋ฐฉ๋ฌธํ ์ง์ ์์ ๋ค์ ์, ํ, ์ข, ์ฐ๋ฅผ ์ดํด๋ณด๋ฉด์ ๋ฐฉ๋ฌธ์ ์งํํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด, ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ง์ ์ ๋ฐฉ๋ฌธํ ์ ์๋ค.
- ๋ชจ๋ ๋ ธ๋์ ๋ํ์ฌ 1~2๋ฒ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉฐ, ๋ฐฉ๋ฌธํ์ง ์์ ์ง์ ์ ์๋ฅผ ์นด์ดํธํ๋ค.
<์ฝ๋>
#DFS๋ก ํน์ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋
ธ๋๋ค๋ ๋ฐฉ๋ฌธ
def dfs(x, y):
# ์ฃผ์ด์ง ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ์๋ ์ฆ์ ์ข
๋ฃ
if x<= -1 or x>=n or y<=-1 or y>=m:
return False
# ํ์ฌ ๋
ธ๋๋ฅผ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด
if graph[x][y] == 0:
#ํด๋น ๋
ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
graph[x][y] = 1
#์, ํ, ์ข, ์ฐ์ ์์น๋ค๋ ๋ชจ๋ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
dfs(x-1,y)
dfs(x,y-1)
dfs(x+1,y)
dfs(x,y+1)
return True
return False
# N, M์ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ์ฌ ์
๋ ฅ ๋ฐ๊ธฐ
n, m = map(int, input.split())
# 2์ฐจ์ ๋ฆฌ์คํธ์ ๋งต ์ ๋ณด ์
๋ ฅ ๋ฐ๊ธฐ
graph = []
for i in range(n):
graph.append(list(map(int, input())))
# ๋ชจ๋ ๋
ธ๋(์์น)์ ๋ํ์ฌ ์๋ฃ์ ์ฑ์ฐ๊ธฐ
result = 0
for i in range(n):
for j in range(m):
# ํ์ฌ ์์น์์ DFS ์ํ
if dfs(i,j) == True:
result += 1
print(result)
<๋ฌธ์ 2> ๋ฏธ๋ก ํ์ถ
- ๋๋น์ด๋ N x M ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ ํํ์ ๋ฏธ๋ก์ ๊ฐํ๋ค. ๋ฏธ๋ก์๋ ์ฌ๋ฌ ๋ง๋ฆฌ์ ๊ดด๋ฌผ์ด ์์ด ์ด๋ฅผ ํผํด ํ์ถํด์ผ ํ๋ค.
- ๋๋น์ด์ ์์น๋ (1,1)์ด๋ฉฐ ๋ฏธ๋ก์ ์ถ๊ตฌ๋ (N,M)์ ์์น์ ์กด์ฌํ๋ฉฐ ํ ๋ฒ์ ํ ์นธ์ฉ ์ด๋ํ ์ ์๋ค. ์ด๋ ๊ดด๋ฌผ์ด ์๋ ๋ถ๋ถ์ 0์ผ๋ก, ๊ดด๋ฌผ์ด ์๋ ๋ถ๋ถ์ 1๋ก ํ์๋์ด ์๋ค. ๋ฏธ๋ก๋ ๋ฐ๋์ ํ์ถํ ์ ์๋ ํํ๋ก ์ ์๋๋ค.
- ์ด๋ ๋๋น์ด๊ฐ ํ์ถํ๊ธฐ ์ํด ์์ง์ฌ์ผ ํ๋ ์ต์ ์นธ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ผ. ์นธ์ ์ ๋๋ ์์ ์นธ๊ณผ ๋ง์ง๋ง ์นธ์ ๋ชจ๋ ํฌํจํด์ ๊ณ์ฐํ๋ค.
<๋ฌธ์ ํด๊ฒฐ>
- BFS๋ ์์ ์ง์ ์์ ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ์ฐจ๋ก๋๋ก ๊ทธ๋ํ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ํ์ํ๋ค.
- ์, ํ, ์ข, ์ฐ๋ก ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋
ธ๋๋ก์ ๊ฑฐ๋ฆฌ๊ฐ 1๋ก ๋์ผํ๋ค.
- ๋ฐ๋ผ์ (1,1) ์ง์ ๋ถํฐ BFS๋ฅผ ์ํํ์ฌ ๋ชจ๋ ๋ ธ๋์ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ฐ์ ๊ธฐ๋กํ๋ฉด ํด๊ฒฐํ ์ ์๋ค.
<์ฝ๋>
# BFS ์์ค์ฝ๋ ๊ตฌํ
def bfs(x, y):
# ํ(Queue) ๊ตฌํ์ ์ํด deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
queue = deque()
queue.append((x,y))
# ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณตํ๊ธฐ
while queue:
x, y = queue.popleft()
# ํ์ฌ ์์น์์ 4๊ฐ์ง ๋ฐฉํฅ์ผ๋ก์ ์์น ํ์ธ
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
# ๋ฏธ๋ก ์ฐพ๊ธฐ ๊ณต๊ฐ์ ๋ฒ์ด๋ ๊ฒฝ์ฐ ๋ฌด์
if nx < 0 or nx >= n or ny < 0 or ny >= m:
continue
# ๋ฒฝ์ธ ๊ฒฝ์ฐ ๋ฌด์
if graph[nx][ny] == 0:
continue
# ํด๋น ๋
ธ๋๋ฅผ ์ฒ์ ๋ฐฉ๋ฌธํ๋ ๊ฒฝ์ฐ์๋ง ์ต๋จ ๊ฑฐ๋ฆฌ ๊ธฐ๋ก
if graph[nx][ny] == 1:
graph[nx][ny] = graph[x][y] + 1
queue.append((nx,ny))
# ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐํ
return graph[n-1][m-1]
from collections import deque
# N, M์ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ์ฌ ์
๋ ฅ ๋ฐ๊ธฐ
n, m = map(int, inpit().split())
# 2์ฐจ์ ๋ฆฌ์คํธ์ ๋งต ์ ๋ณด ์
๋ ฅ ๋ฐ๊ธฐ
graph = []
for i in range(n):
graph.append(list(map(int, input())))
# ์ด๋ํ ๋ค๊ฐ์ง ๋ฐฉํฅ ์ ์ (์, ํ, ์ข, ์ฐ)
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
# BFS๋ฅผ ์ํํ ๊ฒฐ๊ณผ ์ถ๋ ฅ
print(bfs(0,0))
→ graph[nx][ny] = graph[x][y] + 1 : ํ์ฌ๊น์ง ๊ธฐ๋ก๋ ๊ทธ๋ํ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ graph[nx][ny] ์ ์ง์ด ๋ฃ์
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ์ด์ฌ ์ฝ๋ฉํ ์คํธ ์ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ ์ ๋ฆฌ (0) | 2024.03.02 |
---|---|
์ฐ์ ์์ ํ (Priority Queue) (0) | 2023.02.15 |
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ (Dynamic Programming) (4) | 2023.01.23 |
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ (Greedy Algorithm) (0) | 2023.01.16 |