๐ ๋๋น๋ ๋์ ์ด์ฝํ 2021 ๊ฐ์ ๋ชฐ์๋ณด๊ธฐ๋ฅผ ๋ณด๋ฉด์ ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ๊ณ ์์ต๋๋ค. ์ฑ ์ ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋ค with ํ์ด์ฌ์ ์ฐธ๊ณ ํ์ฌ ํ์ตํ์ต๋๋ค.๐
โโโ โ
ํ์(Search)๋ ๋ง์ ์์ ๋ฐ์ดํฐ ์ค์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ณผ์ !
๋ํ์ ์ธ ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก๋ DFS์ BFS๊ฐ ์๋ค.
DFS/BFS๋ ์ฝ๋ฉ ํ ์คํธ์์ ๋งค์ฐ ์์ฃผ ๋ฑ์ฅํ๋ ์ ํ์ด๋ฏ๋ก ๋ฐ๋์ ์์ง!!
DFS/BFS ์์ํ๊ธฐ ์ ์ ๋ฐ๋์ ์์์ผํ ์๋ฃ๊ตฌ์กฐ๋ ์คํ, ํ
๋จผ์ ์คํ ์๋ฃ๊ตฌ์กฐ์ ๋ํด ๊ณต๋ถํด๋ณด์.
๋จผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๊ฐ ๋์ค์ ๋๊ฐ๋ ํ์(์ ์ ํ์ถ)์ ์๋ฃ๊ตฌ์กฐ
์ ๊ตฌ์ ์ถ๊ตฌ๊ฐ ๋์ผํ ํํ๋ก ์คํ์ ์๊ฐํํ์!
ํ์ด์ฌ์์ ์คํ์ ์ด์ฉํ๊ธฐ ์ํด์ ๋ฆฌ์คํธ ์ด์ฉํ๋ฉด ๋ผ
๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ ์์๋ฅผ ์ฝ์ ํ๋ append()ํจ์์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ ์์๋ฅผ ์ญ์ ํ๋ pop()ํจ์๋ฅผ ์ด์ฉํด์ ์คํ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ด
์คํ์ ๋ด๊ฒจ์๋ ์์๋ฅผ ์ถ๋ ฅํ ๋ ์คํ์ ์ต์๋จ์์๋ถํฐ ์ถ๋ ฅํ๋ค๋ฉด ํ์ฌ ์คํ์ด ๋ฆฌ์คํธ ํํ๋ก ๊ตฌํ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฆฌ์คํธ์ ๋ด๊ธด ์์๋ฅผ ๊ฑฐ๊พธ๋ก ์ถ๋ ฅํ๋ฉด ๋ผ!
print(stack[::-1]) โ ์ด๋ ๊ฒ ํ๋ฉด ๋ผ! ์ต์๋จ ์์๋ถํฐ ์ถ๋ ฅ! -- ์คํ์ ์ฐจ๋ก์ฐจ๋ก popํ๋๊ฒ๊ณผ ๊ฐ์
print(stack) --> ์ตํ๋จ ์์๋ถํฐ ์ถ๋ ฅ
ํ ์๋ฃ๊ตฌ์กฐ์ ๋ํด์ ๊ณต๋ถํด๋ณด์
๋จผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ๋๊ฐ๋ ํ์(์ ์ ์ ์ถ)์ ์๋ฃ๊ตฌ์กฐ
ํ๋ ์ ๊ตฌ์ ์ถ๊ตฌ๊ฐ ๋ชจ๋ ๋ซ๋ ค ์๋ ํฐ๋๊ณผ ๊ฐ์ ํํ๋ก ์๊ฐํ!
์ฆ, ์์์ ์ฝ์ ํด์ฃผ๊ณ ๋ค์์ ์ญ์ ํด์ฃผ๋ฉด ๋ผ! โ ํ์ด์ฌ์์ ๊ณต๊ฐ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ํ๋ฅผ ๊ตฌํํ ๋๋ ๋ฆฌ์คํธ๊ฐ ์๋ ๋ฐํฌ๋ฅผ ์ฌ์ฉํ์.
ํ์ด์ฌ์์ ํ๋ฅผ ์ฌ์ฉํ ๋๋ ๋ฐํฌ(deque) ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ!!!
append()ํจ์๋ ๋ฆฌ์คํธ์์ ๋์๊ณผ ๋์ผ. ๋ง์ง๋ง์ ์ฝ์ ํด!!
popleft()ํจ์๋ ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ผ๋ ์ฌ์ฉ -- ๋จผ์ ๋ค์ด์์๋ ๋ฐ์ดํฐ๋ ์์์๋ถํฐ ์ฑ์์ง์์.
์ฌ๊ทํจ์(Recursive Function)๋ DFS๋ฅผ ๊ตฌํํ ๋ ์์ฃผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ผ!
(๊ฑฐ์ ๋๋ถ๋ถ)
<์์์ ๊ณต๋ถํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ด์ DFS์ ๋ํด์ ์์๋ณด์>
์คํ์๋ฃ๊ตฌ์กฐ ํน์ ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ๋ค.
์ฌ๊ทํจ์๋ก ํ์ํ๊ฑฐ๋ ๋ฌธ์ ๋ฅผ ํผ๋ค๊ณ ํ ๋, ํจ์ ์ด๋ฆ์ dfs๋ก ํด์ ํ์
ํ์์์๋ ธ๋๋ฅผ ์ธ์๋ก ์ฃผ๊ธฐ!
์ด๋์๋ถํฐ ๋ฐฉ๋ฌธํ๋ ์๊ด์์ด! ๊ทธ๋๋ ๋ฒํธ๊ฐ ๋ฎ์ ์ธ์ ๋ ธ๋๋ถํฐ ์ค๋นํ์
๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๊ณ (visited[v] = 1) ์คํ์ ์ฝ์ ํ์ผ๋(DFS(v)) ์ธ์ ๋ ธ๋ ํ์ธํด์ผํด
๊ทธ๋ํ๋ฅผ ์ด์ฐจ์ ๋ฆฌ์คํธ๋ก ์ค๋นํ๊ณ , ํด๋น ๋ ธ๋์ ๊ฐ์ด ๋ฐ๋ก ์ธ์ ๋ ธ๋๊ฒ ๋ค
๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋ ์ค์์ ๋ ธ๋ ๊ฐ์ด ์์ ๋ ธ๋๋ถํฐ ๋ฐฉ๋ฌธํด!!!!
๋์ด์ ๋ค์ด๊ฐ ๊ณณ์ด ์๋ค๋ฉด ๋์์์ ๋ค์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๊ฐ ์๋ ๊ณณ์ผ๋ก ๋์๊ฐ๊บผ์ผ! (๋ฐฑํธ๋ํน)
์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํด์ ๋ค์ด๊ฐ์ ์ธ์ ๋ ธ๋๊ฐ ์๋ค ? ๊ทธ๋ผ ์ด์ ์คํ์์ ๊บผ๋ด๋๊ฑฐ์ผ
๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ค์ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ!
ํ์ด์ฌ์์๋ ๊ทธ๋ํ๋ฅผ ํํํ๊ธฐ ์ํด 2์ฐจ์๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด!
์ผ๋ฐ์ ์ผ๋ก ๊ทธ๋ํ ๋ฌธ์ ๊ฐ ์ถ์ ๋๋ฉด ๋ ธ๋์ ๋ฒํธ๊ฐ 1๋ฒ๋ถํฐ ์ถ๋ฐํ๋ ๊ฒ์ด ๋ง๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค 0๋ฒ์ ๋ํด์๋ ๋น์๋๊ณ 1๋ฒ ์ธ๋ฑ์ค๋ถํฐ ํด๋น ๋ ธ๋์ ์ธ์ ํ ๋ ธ๋๊ฐ ๋ฌด์์ธ์ง ๋ฆฌ์คํธ ํํ๋ก ๋ด์์ค ์ ์์ด!
์ฆ ์์ ๊ฐ์ด 1๋ฒ ๋ ธ๋์ ์ธ์ ํ ๋ ธ๋๋ 2,3,8๋ฒ์ด๋ผ๊ณ ๋ฆฌ์คํธ๋ฅผ ์ด๊ธฐํํ ๊ฒ์ ํ์ธํ ์ ์์!
โ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ์ํด ํ๋์ 1์ฐจ์ ๋ฆฌ์คํธ ํ์! -- ๊ธฐ๋ณธ๊ฐ์ False๋ก ํด์ ๋ชจ๋ ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์์
๐ ์ธ๋ฑ์ค 0์ ์ฌ์ฉํ์ง ์๋ ๋ฐฉ์์ ์ด์ฉํ๋๊ฒ ๋ฌธ์ ์์ ๋์์๋ ๋ ธ๋์ ๋ฒํธ๋ฅผ ๊ทธ๋๋ก ์ธ๋ฑ์ค ํํ๋ก ๋งตํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ํท๊ฐ๋ฆฌ์ง ์๊ณ ์ง๊ด์ ์ผ ์ ์์ด!
#DFS ์์ค์ฝ๋ -- DFS ๋ฉ์๋ ์ ์
def dfs(graph, v, visited): #๊ทธ๋ํ์ ์ ๋ณด, ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ ๋ฆฌ์คํธ ์ด์ฉ ๋ฆฌ์คํธ๋ ๊ตณ์ด ์ธ์๋ก ์๋ฃ์ด์ค๋ ๋๊ธด ํ๋ค.
#ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
visited[v] = True
print(v, end = " ")
#ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋
ธ๋๋ค ์ฌ๊ท์ ์ผ๋ก ๋ฐฉ๋ฌธ
for i in graph[v]: #graph[v]๋ ํ์ฌ ๋
ธ๋ v์ ์ธ์ ํ ๋
ธ๋๋ค ํ๋์ฉ ๊บผ๋ด์ ํ์ธํ ๊บผ์ผ!!
if visited[i] == False: #์ธ์ ํ ๋
ธ๋ ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด ๋ฐฉ๋ฌธํด์ผ์ง --> if not์จ๋ ๋จ
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 #์ธ๋ฑ์ค 1๋ถํฐ ํ ๊บผ๋ผ ํ๊ฐ ๋!
#์ ์๋ DFSํจ์ ํธ์ถ
dfs(graph, 1, visited)
โฝ ํญ์ ํด๋น ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ์๊ฐ ํ์ฌ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋จผ์ ํด์ฃผ๋๊ฑฐ ์์ง๋ง์!
๋ชจ๋
ํ์ ์ฝ์
ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค.BFS๋ ํด๋น์์ ์์ ์ธ์ ํ ๋ ธ๋๋ฅผ ํ๋ฒ์ ์ ๋ถ ํ์ ๋ฃ๋๋ค๋ ๊ฒ์ด ํน์ง!
์์ ๋ ธ๋๋ถํฐ ๋ฃ์๊บผ์ผ!
ํ์ด์ฌ์์ BFS์ฝ๋๋ ํ๋ฅผ ์ํด deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ธ!
DFS๋์ ๋ง์ฐฌ๊ฐ์ง๋ก 0๋ฒ ์ธ๋ฑ์ค๋ ์ฌ์ฉํ์ง ์์
BFS ์์ค์ฝ๋
#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]: #graph[v]๋ ํ์ฌ ๋
ธ๋์ ์ธ์ ํ ๋
ธ๋๋ค์ ๋ฆฌ์คํธ!
if visited[i] == False: #๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ผ๋ฉด!
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 #์ธ๋ฑ์ค 1๋ถํฐ ํ ๊บผ๋ผ ํ๊ฐ ๋!
#์ ์๋ DFSํจ์ ํธ์ถ
bfs(graph, 1, visited)
์ด ๋ฌธ์ ๋ ์๋ก ์ฐ๊ฒฐ์์ ๊ฐ์๊ฐ ๋ช๊ฐ์ธ์ง ๊ตฌํ๋ฉด ๋ผ!
์ฆ ์ธ์ ํ ๋ ธ๋์ ํํ๋ก ๊ทธ๋ํ ์ ํ์ ๋ฌธ์ ๋ผ๋๊ฑฐ ํ์ ํ์ด์ผํด โ (DFS BFS๋ก ํ ์ ์๊ฒ ๋ค..? ๊น์ง ์บ์นํ๊ณ ์งํํ์)
1๋ก ์ฒ๋ฆฌ๋์ด ์๋ ์นธ์ ์ธ์ ํ์ง ์์์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋์ง ์์๊บผ์ผ
๋ฐฉ๋ฌธ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง๋ ์์์ ๋ํด์๋ง ์นด์ดํ ํ๋ฉด ๋๋ค.
๋ฐฉ๋ฌธํ ์ง์ ์์ ๋ค์ ์ํ์ข์ฐ๋ฅผ ์ดํผ๊ณ ๋ฐฉ๋ฌธ์ ์งํํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ ๊ฒ์ด ํต์ฌ !
์๋ฃ์ ์ผ๋ ค๋จน๊ธฐ ํด๋น๋ฌธ์ ์์ค์ฝ๋
#์๋ฃ์ ์ผ๋ ค๋จน๊ธฐ
N, M = map(int, input().split())
#DFS๋ก ํน์ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋
ธ๋๋ค(์ธ์ ํ ๋
ธ๋)๋ ๋ฐฉ๋ฌธ
def dfs(x,y):
#์ฃผ์ด์ง ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ์๋ ์ฆ์ ์ข
๋ฃ
if x <= -1 or x>=N or y <= -1 or y >=M: #2์ฐจ์ ๋ฆฌ์คํธ ๋ฒ์ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ
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 #์ด๋ฏธ ๋ฐฉ๋ฌธํ์ผ๋ฉด False ๋ฆฌํด
#2์ฐจ์๋ฆฌ์คํธ ์ ๋งต ์ ๋ณด ์
๋ ฅ๋ฐ๊ธฐ
# graph = []
# for i in range(N):
# graph.append(list(map(int, input().split)))
graph = [list(map(int, input().split())) for i in range(N)] #๊ฐ๋จํ๊ฒ 2์ฐจ์ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
#๋ชจ๋ ๋
ธ๋(์์น)์ ๋ํด์ ์๋ฃ์ ์ฑ์ฐ๊ธฐ
result = 0
for i in range(N):
for j in range(M): #NxM 2์ฐจ์์์ ์ํ.
#ํ์ฌ ์์น์์ DFS์ํ
if dfs(i, j) == True: #dfsํ๋ฒ ์ํํ๋ฉด ํด๋น ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋
ธ๋๋ค๋ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ํ ์ ์๋๋กํจ!!
result +=1 #ํด๋น ๋
ธ๋๋ง ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋๋ฉด +1
#i,jํ๋ฒ ๋ฐฉ๋ฌธํ๋ฉด ์ธ์ ํ ๋
ธ๋๋ค์ ๋ชจ๋ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋์์! ๊ทธ๋์ ์นด์ดํ
ํ๋ฒ๋ง ๋ผ!!!!
print(result)
๊ฐ์ด 1์ธ ๋ ธ๋๋ก๋ง ์ด๋์ด ๊ฐ๋ฅํ๋ค๊ณ ํ๋ณํ์ฌ ์ต๋จ๊ฑฐ๋ฆฌ ๊ตฌํ ์ ์์ด!
๊ทธ ์ด์ ๋ ์์์์น์ ๋ง์ง๋ง ์์น๊น์ง์ ๋ ธ๋๋ฅผ ํฌํจ๋์ด์ผ ํด!
๋งค๋ฒ ์๋ก์ด ์ง์ ์ ๋ฐฉ๋ฌธํ ๋ ๊ทธ ์ด์ ์ง์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ์ +1์ ํด์ ๊ธฐ๋ก!
๊ฒฐ๊ตญ ๋ง์ง๋ง์์น์ ๊ธฐ๋ก๋์ด ์๋ ์ต๋จ๊ฑฐ๋ฆฌ ๊ฐ์ ์ถ๋ ฅํ๋๋ก ๋ง๋ค๋ฉด ์ ๋ต ํ์ ์ ๋ฐ์ ์ ์์ด!!
#๋ฏธ๋กํ์ถ ๋ฌธ์
from re import A
import heapq as hq #ํํ! ์ฐ๊ฒ ๋ค๋ ์๋ฆฌ
from collections import deque #๋ฐํฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ธ!
import sys
sys.stdin = open("input.text", "rt")
#์ด ๋ฌธ์ ์ญ์ ํ, ์ด์ ์ถ์ ์์ผ์ ๋ด๊ฐ ์ดํดํ ์ ์๋ ํ๊ฒฝ์ผ๋ก ๋ง๋ค๊ณ ์ด๋ป๊ฒ ๊ตฌ๋๋๋์ง ์์ธกํด๋ณด๋ฉด์ ํ์ด๋ณด๋๊ฒ ์ข๋ค! 3x3์ผ๋ก ๋ง๋ค์ด์ ์ด๋ป๊ฒ ํ๋ฉด ๋ ๊น? ๋ฅผ ์๊ฐํด๋ดค์ด์ผํจ!!!
#๋ฏธ๋กํ์ถ NxM
#(1,1) ์์, ์ถ๊ตฌ (N,M) ํ๋ฒ์ ํ์นธ์ฉ
#๊ดด๋ฌผ์ด ์๋ ๊ณณ 0 ๊ดด๋ฌผ์ด ์๋ ๊ณณ 1๋ก ํ์
#ํ์ถํ๊ธฐ ์ํด ์์ง์ฌ์ผ ํ๋ ์ต์ ์นธ์ ๊ฐ์ ๊ตฌํ๊ธฐ
# ์ด ๋ฌธ์ ๋ BFS!! BFS๋ ๊ฐ์ ์ ๋น์ฉ์ด ๊ฐ์ ๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ํ์ํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ด์ผ!
#์์์ง์ ์์ ๊ฐ๊น์ด ๋
ธ๋๋ถํฐ ์ฐจ๋ก๋๋ก ๊ทธ๋ํ์ ๋ชจ๋ ๋
ธ๋๋ฅผ ํ์ํ๊ธฐ ๋๋ฌธ!
#์ด๋ ์ํฉ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋
ธ๋๋ ์ด๋์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๊ฑฐ๋ฆฌ๊ฐ 1๋ก ๋์ผ
#๊ฐ์ฅ ์ผ์ชฝ ์ ์ง์ ์ (1,1)์์ bfs๋ฅผ ์ํํด์ ๋ชจ๋ ๋
ธ๋์ ๋ํ ์ต๋จ๊ฑฐ๋ฆฌ ๊ฐ์ ๊ธฐ๋กํ๋ ๋ฐฉ์์ผ๋ก
#์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ๋ฉด ๋ฌธ์ ํด๊ฒฐ ๊ฐ๋ฅ
N, M = map(int, input().split())
graph = [] #์ด ๋ฌธ์ ๊ฐ ์ ๊ทธ๋ํ ๋ฌธ์ ์ธ์ง ์๊ฐ --> ์ธ์ ํ ์์น์ ์ ๋ณด ๋๋ฌธ..?
for i in range(N):
graph.append(list(map(int, input()))) #๋ฌธ์์ด๋ก ์ซ์ ์
๋ ฅํ๊ฑฐ ์ ๋ถ ์ ์๋ก ๋ฐ๊ฟ์ ๋ฆฌ์คํธํ! ์ด๋ฌ๋ฉด ๊ฐ๊ฐ์ ์ซ์๋ฅผ ์ธ๋ฑ์ค๋ก ์ ๊ทผ๊ฐ๋ฅ
#1์ธ๊ณณ๋ง ์ด๋ํ ์ ์์์. ์ด๋ํ ๋ฐฉํฅ ํ์
#์ด๋ํ ๋ค ๊ฐ์ง ๋ฐฉํฅ ์ ์(์ ํ ์ข ์ฐ) --> ๋ฐฉํฅ๋ฒกํฐ ์ ์!
dx = [-1,1,0,0]
dy = [0,0,-1,1]
#BFS ์์ค์ฝ๋ ๊ตฌํ
def bfs(x,y): #ํ ์ด , bfs๋ ํ ์ฌ์ฉํด์ผ ํ๋๊ฑฐ ์์ง๋ง๊ณ
#ํ(queue) ๊ตฌํ์ ์ํด deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
queue = deque()
queue.append((x,y)) #x,y์ ํํ ๋ฐ์ดํฐ ์ถ๊ฐ ์ฒ์ x,y๋ 0,0 ์ฆ ํ์ด์ ์์น๋ฅผ ํตํด...
#ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
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 #๋ฐ๋ก ์ง์ ๋
ธ๋์์์ ์ต๋จ๊ฑฐ๋ฆฌ ๊ฐ์ 1์ ๋ํด
queue.append((nx,ny)) #์ด๊ฑธ ์ถ๊ฐ!
#๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐํ
return graph[N-1][M-1]
#BFS๋ฅผ ์ํํ ๊ฒฐ๊ณผ ์ถ๋ ฅ
print(bfs(0,0))
โโโ โ
DFS์์๋ ๊น์ด์ฐ์ ! ์ฆ ๋์ด์ ๋ค์ด๊ฐ ์ ์๋ ๋ง๋จ๋ ธ๋๊น์ง ๋จผ์ ๊ฐ๋ ๊ตฌ์กฐ์๋๋ฐ
BFS๋ ๋์ด์ฐ์ ํ์! โ ๋ ๋ฒจ ํ์์ ํด
์ด์งํธ๋ฆฌ๋ฅผ ํตํด ์ดํดํด๋ณด์
0๋ ๋ฒจ์์ ํ๋ฒ ๋ง์ ๊ฐ ์ ์๋ ๊ฒ๋ค. ์ฆ 1๋ ๋ฒจ์ ๋ ธ๋๋ค (๋ฐ๋ก ์ด๋ํ ์ ์๋ ๊ณณ์ผ๋ก ์ด๋)
2๋ ๋ฒจ ์ ๋ค์ 0๋ฒ์์ 2๋ฒ๋ง์ ๊ฐ์์
0๋ ๋ฒจ -> 1๋ ๋ฒจ -> 2๋ ๋ฒจ -> .... ์ด๋ฐ ์์ผ๋ก ๋ฐฉ๋ฌธ์ ์งํ
BFS๋ฅผ ๊ตฌํ ํ๋ ค๋ฉด ํ๋ฅผ ํตํด ๊ตฌํํด! ๋จผ์ ๋ค์ด๊ฐ๊ฒ ๋จผ์ ๋์.
์ต์ด์ ํ์ ๋ฃจํธ๋ ธ๋ 0๋ฒ์ ๋ฃ๊ณ ์์ํด! (๋ฃจํธ๋ ธ๋ pop() ํ๋ฉด์ ์์ํ๋๊ฒ BFS)
๊ทธ๋ฆฌ๊ณ 0๋ฒ์ popํด์ ๋์ค๋ฉด 0๋ฒ๊ณผ ์ฐ๊ฒฐ๋ ํ๋ฒ์ ๊ฐ์ ์ผ๋ก ๊ฐ ์ ์๋ ๋ ธ๋๋ค(์ธ์ ๋ ธ๋)์ ๋ชจ๋ ํ์ ๋ฃ๊ธฐ(ํ์ ๋ค์ด๊ฐ๋ค๋ฉด ํ์์ด๋ผ๊ณ ๋ด์ผํด)
์ฐ๊ฒฐ๋๊ฑธ ๋ค ๋ฃ์๋ค๋ฉด ํ์์ popํ๋ ํด์ ๊ทธ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ํ๋ฒ์ ๊ฐ์ ์ผ๋ก ๊ฐ ์ ์๋ ๋ ธ๋๋ค(์ธ์ ๋ ธ๋)์ ๋ค์ ํ์ ๋ฃ์ด! ๋ค ๋ฃ์์ผ๋ฉด ๋ popํด์ ๋ค์...์ด ๊ณผ์ ๋ฐ๋ณตํด!!!!
๋ฌผ๋ก ์ฌ๋ฐฉ๋ฌธ ํ์ง ์๊ธฐ ์ํด์ ์ค๋ณต์ ๋ฐฉ์งํ๋ ๋ฆฌ์คํธ ํ์ํด
์๋๋ฉด ๊ณ์ ํ๋ฒ๋ง์ ๊ฐ ์ ์๋ ๋ ธ๋๋ค์ ๊ณ์ ์ถ๊ฐํ๋ฉด ๋ฌดํ๋ฃจํ์ ๋น ์ง๊ธฐ ๋๋ฌธ!
DFS/BFS ๋ฌธ์ ๋ ์ํํธ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ๋ป์ด๋๊ฐ๋์ง๋ฅผ ์ ํ์ ํ๋ฉด ๋ฌธ์ ๋ฅผ ํธ๋๋ฐ ์ด๋ ค์์ด ์์๊บผ์ผ