โ๏ธ ๋ฌธ์
<๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ์ ์ฌ๊ฐํ ๋ชจ์์ ์ง๋๊ฐ ์๋ค. 1์ ์ง์ด ์๋ ๊ณณ์, 0์ ์ง์ด ์๋ ๊ณณ์ ๋ํ๋ธ๋ค. ์ฒ ์๋ ์ด ์ง๋๋ฅผ ๊ฐ์ง๊ณ ์ฐ๊ฒฐ๋ ์ง์ ๋ชจ์์ธ ๋จ์ง๋ฅผ ์ ์ํ๊ณ , ๋จ์ง์ ๋ฒํธ๋ฅผ ๋ถ์ด๋ ค ํ๋ค. ์ฌ๊ธฐ์ ์ฐ๊ฒฐ๋์๋ค๋ ๊ฒ์ ์ด๋ค ์ง์ด ์ข์ฐ, ํน์ ์๋์๋ก ๋ค๋ฅธ ์ง์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค. ๋๊ฐ์ ์์ ์ง์ด ์๋ ๊ฒฝ์ฐ๋ ์ฐ๊ฒฐ๋ ๊ฒ์ด ์๋๋ค. <๊ทธ๋ฆผ 2>๋ <๊ทธ๋ฆผ 1>์ ๋จ์ง๋ณ๋ก ๋ฒํธ๋ฅผ ๋ถ์ธ ๊ฒ์ด๋ค. ์ง๋๋ฅผ ์ ๋ ฅํ์ฌ ๋จ์ง์๋ฅผ ์ถ๋ ฅํ๊ณ , ๊ฐ ๋จ์ง์ ์ํ๋ ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐ค ์ ์ถ๋ ฅ ์์
๐ก ํ์ด
BFS+DFS ๋ฌธ์ ์ง ๊ฐ์ง๊ณ ๊ทธ๋ํ ์ ํ ์ด์ฌํ ํ์ด๋ณด๋ ์ค์ด๋ค. ๋ช ๋ฒ์ ์ฝํ ๋ฅผ ๊ฒฝํํด๋ณธ ๊ฒฐ๊ณผ, ๋๋ ๊ธฐ๋ณธ ์ ํ์ ์กฐ๊ฑด์ด ํ๋๋ง ์ถ๊ฐ๋ผ๋ ์์ ๋ชป ๋๋ค๋ ๊ฑธ ์์๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ์ฒ๋ผ ์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ(๋จ์ง ๋ด ์ง์ ์๋ฅผ ์ธ๋ ๊ฒ)๋ฅผ ํด์ค์ผ ํ๋ ์ ํ์ ๋ง์ด ํ์ด๋ด์ผ๊ฒ ๋ค.
1) DFS ํ์ด
import sys
sys.setrecursionlimit(10000)
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
N = int(input())
board = [list(map(int, input())) for _ in range(N)]
visited = [[False]*N for _ in range(N)]
town = []
def DFS(row, col):
global count
count += 1
visited[row][col] = True
for i in range(4):
new_row, new_col = row+dx[i], col+dy[i]
if (0 <= new_row < len(board) and 0 <= new_col < len(board)) and visited[new_row][new_col] == 0 and board[new_row][new_col] == 1:
DFS(new_row, new_col)
return count
for row in range(N):
for col in range(N):
if board[row][col] == 1 and visited[row][col] == 0:
count = 0
town.append(DFS(row, col))
print(len(town))
for home in sorted(town):
print(home)
2) BFS ํ์ด
from collections import deque
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
N = int(input())
board = [list(map(int, input())) for _ in range(N)]
visited = [[False]*N for _ in range(N)]
town = []
def BFS(row, col):
global count
queue = deque([(row, col)])
visited[row][col] = True
count += 1 # ์๊ธฐ ์์ ์ฒดํฌ
while queue:
curr_row, curr_col = queue.popleft()
for i in range(4):
new_row, new_col = curr_row+dx[i], curr_col+dy[i]
if (0 <= new_row < len(board) and 0 <= new_col < len(board)) and visited[new_row][new_col] == 0 and board[new_row][new_col] == 1:
count += 1
visited[new_row][new_col] = True
queue.append((new_row, new_col))
return count
for row in range(N):
for col in range(N):
if board[row][col] == 1 and visited[row][col] == 0:
count = 0
town.append(BFS(row, col))
print(len(town))
for home in sorted(town):
print(home)
BFS๋ก ํ ๋ ์๊ธฐ ์์ ์ ์ฒดํฌํ๋ ๊ฑธ ๋นผ๋จน์ด์ ๋จ์ง ๋ด ์ง์ ์๊ฐ ์ ๋ต๋ณด๋ค 1์ฉ ์๊ฒ ๋์ค๋ ๋ฌธ์ ๊ฐ ์์์ง๋ง ํด๊ฒฐ!
32ms๊ฐ DFS ํ์ด, 52ms๊ฐ BFS ํ์ด๋ค. ๊ทผ๋ฐ DFS/BFS ๊ณต๋ถํ ๋ BFS๊ฐ ๋ ๋น ๋ฅด๋ค๊ณ ํ๋๋ฐ ์ฒ๋ฆฌ ๋ฒ์๊ฐ ์ปค์ง๋ฉด BFS์ ์๋ ์ฒด๊ฐ์ด ๋ ์๋ ์์ง๋ง ์์ง๊น์ง๋ DFS๋ฅผ ์ฌ์ฉํ ํ์ด๊ฐ ๋ ๋น ๋ฅธ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ค.
'Problem Solving > BOJ & Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 1002๋ฒ: ํฐ๋ (0) | 2024.10.03 |
---|---|
[BOJ] 1065๋ฒ: ํ์ (1) | 2024.09.28 |
[BOJ] 1012๋ฒ: ์ ๊ธฐ๋ ๋ฐฐ์ถ (0) | 2024.09.26 |
[BOJ] 10709๋ฒ: ๊ธฐ์์บ์คํฐ (3) | 2024.09.25 |
[BOJ] 3135๋ฒ: ๋ผ๋์ค (0) | 2024.09.24 |