๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐ต๏ธโ๏ธ ๋ฌธ์
์ฐจ์ธ๋ ์๋์ธ ํ๋๋ ๊ฐ์๋ ๊ณ ๋ญ์ง์์ ์ ๊ธฐ๋ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๊ธฐ๋ก ํ์๋ค. ๋์ฝ์ ์ฐ์ง ์๊ณ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๋ ค๋ฉด ๋ฐฐ์ถ๋ฅผ ํด์ถฉ์ผ๋ก๋ถํฐ ๋ณดํธํ๋ ๊ฒ์ด ์ค์ํ๊ธฐ ๋๋ฌธ์, ํ๋๋ ํด์ถฉ ๋ฐฉ์ง์ ํจ๊ณผ์ ์ธ ๋ฐฐ์ถํฐ์ง๋ ์ด๋ฅผ ๊ตฌ์ ํ๊ธฐ๋ก ๊ฒฐ์ฌํ๋ค. ์ด ์ง๋ ์ด๋ ๋ฐฐ์ถ๊ทผ์ฒ์ ์์ํ๋ฉฐ ํด์ถฉ์ ์ก์ ๋จน์์ผ๋ก์จ ๋ฐฐ์ถ๋ฅผ ๋ณดํธํ๋ค. ํนํ, ์ด๋ค ๋ฐฐ์ถ์ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ ๋ง๋ฆฌ๋ผ๋ ์ด๊ณ ์์ผ๋ฉด ์ด ์ง๋ ์ด๋ ์ธ์ ํ ๋ค๋ฅธ ๋ฐฐ์ถ๋ก ์ด๋ํ ์ ์์ด, ๊ทธ ๋ฐฐ์ถ๋ค ์ญ์ ํด์ถฉ์ผ๋ก๋ถํฐ ๋ณดํธ๋ฐ์ ์ ์๋ค. ํ ๋ฐฐ์ถ์ ์ํ์ข์ฐ ๋ค ๋ฐฉํฅ์ ๋ค๋ฅธ ๋ฐฐ์ถ๊ฐ ์์นํ ๊ฒฝ์ฐ์ ์๋ก ์ธ์ ํด์๋ ๊ฒ์ด๋ค.
ํ๋๊ฐ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๋ ๋ ์ ๊ณ ๋ฅด์ง ๋ชปํด์ ๋ฐฐ์ถ๋ฅผ ๊ตฐ๋ฐ๊ตฐ๋ฐ ์ฌ์ด ๋์๋ค. ๋ฐฐ์ถ๋ค์ด ๋ชจ์ฌ์๋ ๊ณณ์๋ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ ๋ง๋ฆฌ๋ง ์์ผ๋ฉด ๋๋ฏ๋ก ์๋ก ์ธ์ ํด์๋ ๋ฐฐ์ถ๋ค์ด ๋ช ๊ตฐ๋ฐ์ ํผ์ ธ์๋์ง ์กฐ์ฌํ๋ฉด ์ด ๋ช ๋ง๋ฆฌ์ ์ง๋ ์ด๊ฐ ํ์ํ์ง ์ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๋ฐฐ์ถ๋ฐญ์ด ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์์ผ๋ฉด ์ต์ 5๋ง๋ฆฌ์ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ์ํ๋ค. 0์ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์์ง ์์ ๋ ์ด๊ณ , 1์ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์๋ ๋ ์ ๋ํ๋ธ๋ค.
๐ก ์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ ์ค๋ถํฐ ๊ฐ๊ฐ์ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ์ฒซ์งธ ์ค์๋ ๋ฐฐ์ถ๋ฅผ ์ฌ์ ๋ฐฐ์ถ๋ฐญ์ ๊ฐ๋ก๊ธธ์ด M(1 ≤ M ≤ 50)๊ณผ ์ธ๋ก๊ธธ์ด N(1 ≤ N ≤ 50), ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์๋ ์์น์ ๊ฐ์ K(1 ≤ K ≤ 2500)์ด ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ K์ค์๋ ๋ฐฐ์ถ์ ์์น X(0 ≤ X ≤ M-1), Y(0 ≤ Y ≤ N-1)๊ฐ ์ฃผ์ด์ง๋ค. ๋ ๋ฐฐ์ถ์ ์์น๊ฐ ๊ฐ์ ๊ฒฝ์ฐ๋ ์๋ค.
๐ ์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ํ์ํ ์ต์์ ๋ฐฐ์ถํฐ์ง๋ ์ด ๋ง๋ฆฌ ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐โ๏ธ ํ์ด๋ณด์~
์ฐ์ ๋ฐฐ์ถ๋ฐญ์ 0์ผ๋ก ๋ค ์ฑ์๋ฃ์ด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ์ ๊ฐ์ ํฌ๊ธฐ๋ก false ์ธ์ง true์ธ์ง๋ฅผ ๋ด์์ค ๋ฐฐ์ด์ ๋ง๋ ๋ค. ( ์ผ์ชฝ ์๋จ์ด (0, 0)์ด ๋๊ฒ )
array=[[0]*m for _ in range(n)]
visited = [[False]*m for _ in range(n)]
๊ทธ๋ฆฌ๊ณ k๋ฒ์ฉ ๋๋ฉด์ x, y ์ ํด๋นํ๋ ๊ฐ์ ๋ฐ์์ค๋ค.
for _ in range(k):
y, x = map(int,input().split())
array[x][y] = 1
๊ฐ๋ก๋ก m๊น์ง ์ธ๋ก๋ก n๊น์ง for๋ฌธ์ ๋๋ฉด์ array์ visited๋ฅผ ํตํด ๋ฐฐ์ถ๋ ์ฌ์ด์ ธ์์ง๋ง ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ์ ์ฐพ์ ๋ฐฉ๋ฌธํด์ฃผ๋ dfs๋ bfs๋ฅผ ์คํ์ํค๋ฉด๋๋ค.
for i in range(n):
for j in range(m):
if array[i][j] and not visited[i][j]:
dfs(i,j) ๋ bfs(i,j)
1. DFS๋ก ํ ๊ฒฝ์ฐ
์ฌ๊ท ์ฉ๋ฒ์ ์ฌ์ฉํ ๊ฒ์ด๋ค.
ํ์ด์ฌ์ ์ฌ๊ท ๊น์ด ์ ํ์ 1000์ผ๋ก ๋งค์ฐ ์๊ธฐ ๋๋ฌธ์, ์ด ๋ฌธ์ ๋ฅผ ๊ทธ๋ฅ ํผ๋ค๋ฉด ๋ฐํ์ ์๋ฌ๊ฐ ๋๋ค.
ํ์ด์ฌ์ผ๋ก ์ฌ๊ท๋ฅผ ์ฌ์ฉํด ํ์ด์ผํ๋ ๋ฌธ์ ๋ผ๋ฉด setrecursionlimit๋ฅผ ์ฐ๋ ๊ฒ์ ์ ํ์ด ์๋ ํ์๋ค.
- ์ํ์ข์ฐ๋ก ์์ง์ผ ์ ์๋ ๋ฐฉํฅ์ ์ ํด์ฃผ๊ณ ์ด๋ฅผ for๋ฌธ์ผ๋ก ๋๋ฆฐ๋ค.
- ๊ฐ ์์น์ ๊ฐ์ด 0๋ณด๋ค ํฌ๊ณ ์ต๋ ๊ธธ์ด๋ณด๋ค ์์์ง 1์ฐจ์ ์ผ๋ก ํ์ธ์ ํด์ฃผ๊ณ , ์ด์ ํด๋น๋์ง ์๋๋ค๋ฉด continue๋ฅผ ์ฌ์ฉํด ๋ค์ ์์น๋ก ๋๊ฒจ์ฃผ๊ฒ for๋ฌธ์ผ๋ก ๋์ง๋ค.
- ๋ง๋ค๋ฉด ์ด์ ํ์ธ์ ํด์ค๋ค. ์ด๊ณณ์ ๋ฐฐ์ถ๊ฐ ์๊ณ ๋ฐฉ๋ฌธํ ์ ์ด ์๋๊ฐ?
# ํ
์คํธ ์ผ์ด์ค ๊ฐ์๋ฅผ ์
๋ ฅ๋ฐ๋๋ค.
# ๋ง์ฝ ์ฌ๊ท๋ฅผ ์ฌ์ฉํด์ ํ์ด์ผํ๋ ๋ฌธ์ ๋ผ๋ฉด setrecursionlimit์ ์ฐ๋ ๊ฒ์ ์ ํ์ด ์๋ ํ์๋ค.
# ํ์ด์ฌ์ ๊ธฐ๋ณธ ์ฌ๊ท ๊น์ด ์ ํ์ 1000์ผ๋ก ๋งค์ฐ ์๋ค.
# ๋ฐ๋ผ์ ์ฌ๊ท๋ก ๋ฌธ์ ๋ฅผ ํ๊ฒฝ์ฐ ์ด์ ํ์ ๊ฑธ๋ ค ์๋ฌ๋ฉ์ธ์ง๋ฅผ ๋ณผ์ ์๋ค.
# ๋ฐํ์ ์๋ฌ๊ฐ ๋๋ค.
import sys
sys.setrecursionlimit(100000)
def dfs(x,y):
visited[x][y] = True
directions = [ (-1, 0), (1, 0), (0, -1), (0, 1)]
# ์ํ ์ข์ฐ๋ก ์์ง์ผ ์ ์๋ ๋ฐฉํฅ์ ์ง์ ํด์ฃผ๊ณ ์ฌ๊ธฐ์ for๋ฌธ์ ๋๋ฆฐ๋ค.
for dx, dy in directions:
nx, ny = dx + x, dy+y
if nx < 0 or nx >=n or ny<0 or ny>=m:
continue
if array[nx][ny] and not visited[nx][ny]:
dfs(nx,ny)
for _ in range(int(input())):
m, n, k = map(int,input().split())
array=[[0]*m for _ in range(n)]
visited = [[False]*m for _ in range(n)]
for _ in range(k):
y, x = map(int,input().split())
array[x][y] = 1
result = 0
for i in range(n):
for j in range(m):
if array[i][j] and not visited[i][j]:
dfs(i,j)
result += 1
print(result)
2. BFS๋ก ํ์ด๋ณด๋ฉด,,,
BFS๋ ๋ฑ..deque
dfs์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ง์ผ ์ ์๋ ์ํ์ข์ฐ์ ์์น๋ฅผ ๋ด์ for๋ฌธ์ ๋๋ ค์ค ๊ฒ์ด๋ค.
from collections import deque
def bfs(x,y):
q = deque()
q.append((x,y))
visited[x][y] = True
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
while q:
x, y = q.popleft()
for dx, dy in directions:
nx, ny = x+dx, y+dy
if nx < 0 or nx >= n or ny < 0 or ny >= m:
continue
if array[nx][ny] and not visited[nx][ny]:
q.append((nx,ny))
visited[nx][ny]=True
for _ in range(int(input())):
m, n, k = map(int,input().split())
array=[[0]*m for _ in range(n)]
visited = [[False]*m for _ in range(n)]
for _ in range(k):
y, x = map(int,input().split())
array[x][y] = 1
result = 0
for i in range(n):
for j in range(m):
if array[i][j] and not visited[i][j]:
bfs(i,j)
result += 1
print(result)
'๐ต๏ธโโ๏ธ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] BOJ 1325 ํจ์จ์ ์ธ ํดํน (BFS) (1) | 2021.11.19 |
---|---|
[Python] BOJ 2606 ๋ฐ์ด๋ฌ์ค (BFS/DFS) (0) | 2021.11.17 |
์ฝํ ๋๋น ๋ฐฑ์ค๋ฌธ์ ์ถ์ฒ (0) | 2021.11.05 |
[Python] BOJ 14719 ๋น๋ฌผ (0) | 2021.11.04 |
[Python] BOJ 1149 RGB๊ฑฐ๋ฆฌ (dp) (0) | 2021.11.04 |