๐๋ณธ ํฌ์คํ ์ '(์ด์ฝํ 2021) ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋ค with ํ์ด์ฌ' ์ ํ๋ธ ๊ฐ์๋ฅผ ์๊ฐํ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
DFS๋ ๊น์ด ์ฐ์ ํ์
์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ ๊ทธ๋ํ์์ ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
์ด๋ค.
DFS๋ ์คํ ์๋ฃ๊ตฌ์กฐ(ํน์ ์ฌ๊ท ํจ์)
๋ฅผ ์ด์ฉํ๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ๋์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
[ DFS ๋์ ์์ ]
[Step 1] ์์ ๋ ธ๋์ธ '1'์ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
[Step 2] ์คํ์ ์ต์๋จ ๋
ธ๋์ธ '1'์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋
ธ๋ '2','3','8'์ด ์๋ค.
์ด ์ค์์ ๊ฐ์ฅ ์์ ๋
ธ๋์ธ '2'๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
[Step 3] ์คํ์ ์ต์๋จ ๋
ธ๋์ธ '2'์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋
ธ๋ '7'์ด ์๋ค.
๋ฐ๋ผ์ '7'๋ฒ ๋
ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
[Step 4] ์คํ์ ์ต์๋จ ๋
ธ๋์ธ '7'์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋
ธ๋ '6','8'์ด ์๋ค.
์ด ์ค์์ ๊ฐ์ฅ ์์ ๋
ธ๋์ธ '6'์ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
[Step 5] ์คํ์ ์ต์๋จ ๋
ธ๋์ธ '6'์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋
ธ๋๊ฐ ์๋ค.
๋ฐ๋ผ์ ์คํ์์ '6'๋ฒ ๋
ธ๋๋ฅผ ๊บผ๋ธ๋ค.
[Step 6] ์คํ์ ์ต์๋จ ๋
ธ๋์ธ '7'์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋
ธ๋ '8'์ด ์๋ค.
๋ฐ๋ผ์ '8'๋ฒ ๋
ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
์ด๋ฌํ ๊ณผ์ ์ ๋ฐ๋ณตํ์์ ๋ ์ ์ฒด ๋
ธ๋์ ํ์ ์์(์คํ์ ๋ค์ด๊ฐ ์์)๋ ๋ค์๊ณผ ๊ฐ๋ค.
ํ์ ์์: 1 โ 2 โ 7 โ 6 โ 8 โ 3 โ 4 โ 5
# 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์ฐจ์ ๋ฆฌ์คํธ)
# ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๊ฐ๋ค์ False๋ก ์ด๊ธฐํํ๊ณ , index 0์ ์ฌ์ฉํ์ง ์๋๋ค.
visited = [False]*9
# ์ ์๋ DFS ํจ์ ํธ์ถ
dfs(graph,1,visited)
DFS๋ ์คํ์ ์ด์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ
์ด๊ธฐ ๋๋ฌธ์ ์ค์ ๊ตฌํ์ ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ์ ๋ ๋งค์ฐ ๊ฐ๊ฒฐํ๊ฒ ๊ตฌํํ ์ ์๋ค.
BFS๋ ๋๋น ์ฐ์ ํ์
์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ, ๊ทธ๋ํ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋
ธ๋๋ถํฐ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
์ด๋ค.
BFS๋ ํ ์๋ฃ๊ตฌ์กฐ
๋ฅผ ์ด์ฉํ๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ๋์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ธ์ ํ ๋ ธ๋๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ์ ๋ฃ๋๋ก ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๋จผ์ ๋ค์ด์จ ๊ฒ์ด ๋จผ์ ๋๊ฐ๊ฒ ๋์ด, ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์์ ์งํํ๊ฒ ๋๋ค.
[ BFS ๋์ ์์ ]
[Step 1] ์์ ๋ ธ๋์ธ '1'์ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
[Step 2] ํ์์ ๋ ธ๋ '1'์ ๊บผ๋ด ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋ '2','3','8'์ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ๋ค.
[Step 3] ํ์์ ๋ ธ๋ '2'๋ฅผ ๊บผ๋ด ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋ '7'์ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ๋ค.
[Step 4] ํ์์ ๋ ธ๋ '3'์ ๊บผ๋ด ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋ '4','5'๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ๋ค.
[Step 5] ํ์์ ๋ ธ๋ '8'์ ๊บผ๋ด๊ณ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฏ๋ก ๋ฌด์ํ๋ค.
์ด๋ฌํ ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ์ ์ฒด ๋
ธ๋์ ํ์ ์์(ํ์ ๋ค์ด๊ฐ ์์)๋ ๋ค์๊ณผ ๊ฐ๋ค.
ํ์ ์์: 1 โ 2 โ 3 โ 8 โ 7 โ 4 โ 5 โ 6
๋๋น ์ฐ์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ธ BFS๋ ํ ์๋ฃ๊ตฌ์กฐ
์ ๊ธฐ์ดํ๋ค๋ ์ ์์ ๊ตฌํ์ด ๊ฐ๋จํ๋ค.
ํ์์ ์ํํจ์ ์์ด O(N)์ ์๊ฐ์ด ์์๋๋ฉฐ, ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์ค์ ์ํ ์๊ฐ์ DFS๋ณด๋ค ์ข์ ํธ์ด๋ค.
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)
๋ฌธ์ ์ค๋ช
NXM ํฌ๊ธฐ์ ์ผ์ ํ์ด ์์ต๋๋ค.
๊ตฌ๋ฉ์ด ๋ซ๋ ค ์๋ ๋ถ๋ถ์ 0, ์นธ๋ง์ด๊ฐ ์กด์ฌํ๋ ๋ถ๋ถ์ 1๋ก ํ์๋ฉ๋๋ค.
๊ตฌ๋ฉ์ด ๋ซ๋ ค ์๋ ๋ถ๋ถ๋ผ๋ฆฌ ์,ํ,์ข,์ฐ๋ก ๋ถ์ด ์๋ ๊ฒฝ์ฐ ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค.
์ด๋ ์ผ์ ํ์ ๋ชจ์์ด ์ฃผ์ด์ก์ ๋ ์์ฑ๋๋ ์ด ์์ด์คํฌ๋ฆผ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์.
๋ค์์ 4X5 ์ผ์ ํ ์์์์๋ ์์ด์คํฌ๋ฆผ์ด ์ด 3๊ฐ ์์ฑ๋ฉ๋๋ค.
๋ฌธ์ ํด๊ฒฐ
์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
ํน์ ํ ์ง์ ์ ์ฃผ๋ณ ์,ํ,์ข,์ฐ๋ฅผ ์ดํด๋ณธ ๋ค์ ์ฃผ๋ณ ์ง์ ์ค์์ ๊ฐ์ด '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) # ์ ๋ต ์ถ๋ ฅ
๋ฌธ์ ์ค๋ช
๋๋น์ด๋ NXM ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ ํํ์ ๋ฏธ๋ก์ ๊ฐํ์ต๋๋ค.
๋ฏธ๋ก์๋ ์ฌ๋ฌ ๋ง๋ฆฌ์ ๊ดด๋ฌผ์ด ์์ด ์ด๋ฅผ ํผํด ํ์ถํด์ผ ํฉ๋๋ค.
๋๋น์ด์ ์์น๋ (1,1)์ด๋ฉฐ ๋ฏธ๋ก์ ์ถ๊ตฌ๋ (N,M)์ ์์น์ ์กด์ฌํ๋ฉฐ ํ ๋ฒ์ ํ ์นธ์ฉ ์ด๋ํ ์ ์์ต๋๋ค.
์ด๋ ๊ดด๋ฌผ์ด ์๋ ๋ถ๋ถ์ 0์ผ๋ก, ๊ดด๋ฌผ์ด ์๋ ๋ถ๋ถ์ 1๋ก ํ์๋์ด ์์ต๋๋ค.
๋ฏธ๋ก๋ ๋ฐ๋์ ํ์ถํ ์ ์๋ ํํ๋ก ์ ์๋ฉ๋๋ค.
์ด๋ ๋๋น์ด๊ฐ ํ์ถํ๊ธฐ ์ํด ์์ง์ฌ์ผ ํ๋ ์ต์ ์นธ์ ๊ฐ์๋ฅผ ๊ตฌํ์ธ์.
์นธ์ ์ ๋๋ ์์ ์นธ๊ณผ ๋ง์ง๋ง ์นธ์ ๋ชจ๋ ํฌํจํด์ ๊ณ์ฐํฉ๋๋ค.
๋ฌธ์ ํ์ด
[Step 1] ์ฒ์์ (1,1)์ ์์น์์ ์์ํ๋ค.
Step 2 ์ขํ์์ ์,ํ,์ข,์ฐ๋ก ํ์์ ์งํํ๋ฉด ๋ฐ๋ก ์ ๋ ธ๋์ธ (1,2) ์์น์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ฒ ๋๊ณ ์๋กญ๊ฒ ๋ฐฉ๋ฌธํ๋ (1,2) ๋ ธ๋์ ๊ฐ์ 2๋ก ๋ฐ๊พธ๊ฒ ๋๋ค.
[Step 3] ๋ง์ฐฌ๊ฐ์ง๋ก BFS๋ฅผ ๊ณ์ ์ํํ๋ฉด ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ต๋จ ๊ฒฝ๋ก์ ๊ฐ๋ค์ด 1์ฉ ์ฆ๊ฐํ๋ ํํ๋ก ๋ณ๊ฒฝ๋๋ค.
# 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, input().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))
๊ฒฝ์ฐ์ ์
๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ต๋จ๊ฑฐ๋ฆฌ
๋๋ ์ต์ํ์
๋ฅผ ๊ตฌํ๋ ๋ฌธ์