โ๏ธ ๋ฌธ์
์ฐจ์ธ๋ ์๋์ธ ํ๋๋ ๊ฐ์๋ ๊ณ ๋ญ์ง์์ ์ ๊ธฐ๋ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๊ธฐ๋ก ํ์๋ค. ๋์ฝ์ ์ฐ์ง ์๊ณ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๋ ค๋ฉด ๋ฐฐ์ถ๋ฅผ ํด์ถฉ์ผ๋ก๋ถํฐ ๋ณดํธํ๋ ๊ฒ์ด ์ค์ํ๊ธฐ ๋๋ฌธ์, ํ๋๋ ํด์ถฉ ๋ฐฉ์ง์ ํจ๊ณผ์ ์ธ ๋ฐฐ์ถํฐ์ง๋ ์ด๋ฅผ ๊ตฌ์ ํ๊ธฐ๋ก ๊ฒฐ์ฌํ๋ค. ์ด ์ง๋ ์ด๋ ๋ฐฐ์ถ๊ทผ์ฒ์ ์์ํ๋ฉฐ ํด์ถฉ์ ์ก์ ๋จน์์ผ๋ก์จ ๋ฐฐ์ถ๋ฅผ ๋ณดํธํ๋ค. ํนํ, ์ด๋ค ๋ฐฐ์ถ์ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ ๋ง๋ฆฌ๋ผ๋ ์ด๊ณ ์์ผ๋ฉด ์ด ์ง๋ ์ด๋ ์ธ์ ํ ๋ค๋ฅธ ๋ฐฐ์ถ๋ก ์ด๋ํ ์ ์์ด, ๊ทธ ๋ฐฐ์ถ๋ค ์ญ์ ํด์ถฉ์ผ๋ก๋ถํฐ ๋ณดํธ๋ฐ์ ์ ์๋ค. ํ ๋ฐฐ์ถ์ ์ํ์ข์ฐ ๋ค ๋ฐฉํฅ์ ๋ค๋ฅธ ๋ฐฐ์ถ๊ฐ ์์นํ ๊ฒฝ์ฐ์ ์๋ก ์ธ์ ํด์๋ ๊ฒ์ด๋ค.
ํ๋๊ฐ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๋ ๋ ์ ๊ณ ๋ฅด์ง ๋ชปํด์ ๋ฐฐ์ถ๋ฅผ ๊ตฐ๋ฐ๊ตฐ๋ฐ ์ฌ์ด ๋์๋ค. ๋ฐฐ์ถ๋ค์ด ๋ชจ์ฌ์๋ ๊ณณ์๋ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ ๋ง๋ฆฌ๋ง ์์ผ๋ฉด ๋๋ฏ๋ก ์๋ก ์ธ์ ํด์๋ ๋ฐฐ์ถ๋ค์ด ๋ช ๊ตฐ๋ฐ์ ํผ์ ธ์๋์ง ์กฐ์ฌํ๋ฉด ์ด ๋ช ๋ง๋ฆฌ์ ์ง๋ ์ด๊ฐ ํ์ํ์ง ์ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๋ฐฐ์ถ๋ฐญ์ด ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์์ผ๋ฉด ์ต์ 5๋ง๋ฆฌ์ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ์ํ๋ค. 0์ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์์ง ์์ ๋ ์ด๊ณ , 1์ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์๋ ๋ ์ ๋ํ๋ธ๋ค.
1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 |
๐ค ์ ์ถ๋ ฅ ์์
๐ก ํ์ด
์์ ๊ทธ๋ฆผ๊ณผ ๋ฌธ์ ๋ฅผ ๋ณด์๋ง์ ๋ฐ๋ก BFS ๋์๋ฅผ ๋งก์๊ธฐ ๋๋ฌธ์ BFS๋ก ๊ตฌํํ๋๋ฐ, DFS ํ์ด๋ ๊ฐ๋ฅํ๋ค. BFS/DFS ๋ฌธ์ ํ ๋ ํ, ์ด ํท๊ฐ๋ คํ๋ ๊ฒ ์์ ๋ณด๋ค๋ ์ค์ด๋ ๊ฒ ๊ฐ๊ธด ํ์ง๋ง ๋ ์ฐ์ตํด์ผ๊ฒ ๋ค.
1) BFS ํ์ด
from collections import deque
def BFS(start_row, start_col, field, visited):
queue = deque([(start_col, start_row)])
visited[start_row][start_col] = True
while queue:
x, y = queue.popleft()
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
for i in range(4):
new_x, new_y = x+dx[i], y+dy[i]
if 0 <= new_x < len(field[0]) and 0 <= new_y < len(field) and field[new_y][new_x] == 1 and not visited[new_y][new_x]:
visited[new_y][new_x] = True
queue.append((new_x, new_y))
T = int(input())
for _ in range(T):
M, N, K = map(int, input().split())
farm = [[0]*M for _ in range(N)]
visited = [[False]*M for _ in range(N)]
worm = 0
for _ in range(K):
COL, ROW = map(int, input().split()) # ๋ฐฐ์ถ ์์น X์ด Yํ
farm[ROW][COL] = 1
for row in range(N):
for col in range(M):
if farm[row][col] == 1 and not visited[row][col]:
BFS(row, col, farm, visited)
worm += 1
print(worm)
2) DFS ํ์ด
๋ฐ๋ก ์์์ ํ, ์ด ํท๊ฐ๋ คํ๋ ๊ฒ ์ค ๊ฒ ๊ฐ๋ค๊ณ ํด๋๊ณ DFS๋ก ํ๋ค๊ฐ ์ธ๋ฑ์ค ์๋ฌ ๋ง๋์ ํ์ฐธ ๋ถ์ก๊ณ ์์๋ค ๋จธ์ฑ~ ๊ทผ๋ฐ BFS ํ์ด๋ ๋๊ฐ์ด ํ, ์ด ๋ณ์ ์ผ๋๋ฐ ์ ์ธ๋ฑ์ค ์๋ฌ๊ฐ ๋ฌ์๊น
import sys
sys.setrecursionlimit(10000)
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
dfs_count = 0
def DFS(start_row, start_col, field, visited, dfs_count):
dfs_count += 1
visited[start_row][start_col] = True
for i in range(4):
new_x, new_y = start_row+dx[i], start_col+dy[i]
if 0 <= new_x < len(field) and 0 <= new_y < len(field[0]) and field[new_x][new_y] == 1 and not visited[new_x][new_y]:
DFS(new_x, new_y, field, visited, dfs_count)
T = int(input())
for _ in range(T):
M, N, K = map(int, input().split())
farm = [[0]*M for _ in range(N)]
visited = [[False]*M for _ in range(N)]
worm = 0
for _ in range(K):
COL, ROW = map(int, input().split()) # ๋ฐฐ์ถ ์์น X์ด Yํ
farm[ROW][COL] = 1
for row in range(N):
for col in range(M):
if farm[row][col] == 1 and not visited[row][col]:
DFS(row, col, farm, visited, 0)
worm += 1
print(worm)
192ms๊ฐ DFS ํ์ด, 212ms๊ฐ BFS ํ์ด๋ค.
'Problem Solving > BOJ & Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 1065๋ฒ: ํ์ (1) | 2024.09.28 |
---|---|
[BOJ] 2667๋ฒ: ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ (0) | 2024.09.27 |
[BOJ] 10709๋ฒ: ๊ธฐ์์บ์คํฐ (3) | 2024.09.25 |
[BOJ] 3135๋ฒ: ๋ผ๋์ค (0) | 2024.09.24 |
[BOJ] 4659๋ฒ: ๋น๋ฐ๋ฒํธ ๋ฐ์ํ๊ธฐ (0) | 2024.09.21 |