โ๋ฌธ์
https://www.acmicpc.net/problem/2667
๋ฉ๋ชจ๋ฆฌ: 108548 KB, ์๊ฐ: 92 ms
๋๋น ์ฐ์ ํ์, ๊น์ด ์ฐ์ ํ์, ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์
<๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ์ ์ฌ๊ฐํ ๋ชจ์์ ์ง๋๊ฐ ์๋ค. 1์ ์ง์ด ์๋ ๊ณณ์, 0์ ์ง์ด ์๋ ๊ณณ์ ๋ํ๋ธ๋ค. ์ฒ ์๋ ์ด ์ง๋๋ฅผ ๊ฐ์ง๊ณ ์ฐ๊ฒฐ๋ ์ง์ ๋ชจ์์ธ ๋จ์ง๋ฅผ ์ ์ํ๊ณ , ๋จ์ง์ ๋ฒํธ๋ฅผ ๋ถ์ด๋ ค ํ๋ค. ์ฌ๊ธฐ์ ์ฐ๊ฒฐ๋์๋ค๋ ๊ฒ์ ์ด๋ค ์ง์ด ์ข์ฐ, ํน์ ์๋์๋ก ๋ค๋ฅธ ์ง์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค. ๋๊ฐ์ ์์ ์ง์ด ์๋ ๊ฒฝ์ฐ๋ ์ฐ๊ฒฐ๋ ๊ฒ์ด ์๋๋ค. <๊ทธ๋ฆผ 2>๋ <๊ทธ๋ฆผ 1>์ ๋จ์ง๋ณ๋ก ๋ฒํธ๋ฅผ ๋ถ์ธ ๊ฒ์ด๋ค. ์ง๋๋ฅผ ์ ๋ ฅํ์ฌ ๋จ์ง์๋ฅผ ์ถ๋ ฅํ๊ณ , ๊ฐ ๋จ์ง์ ์ํ๋ ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
โ๐ปํ์ด
๊ฐ ๋จ์ง์ ์ํ๋ ์ง์ ์๋ฅผ ๊ณ์ฐํด์ผ ํ๋ค. ๊ทธ๋ํ ๋ฌธ์ ์ด๋ฏ๋ก ๊ฐ์ฅ ๋จผ์ DFS์ธ์ง BFS์ธ์ง ์๊ฐํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ์ด ๋ฌธ์ ๋ DFS์ BFS ๋ ๋ค ๊ฐ๋ฅํ๋ค.
๋จผ์ , ์ง์ด ์๋ ๊ณณ์ ์ฐพ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ํ์ข์ฐ๋ก ๋๋ฌ๋ณด๋ฉฐ ์ง์ด ์๋ ๊ณณ์ด๋ผ๋ฉด cnt๋ฅผ 1 ์ฆ๊ฐํ๋ค. ๋ง์ฝ ์ฃผ๋ณ์ ๋ ์ด์ ์ง์ด ์๋ ๊ณณ์ด ์๋ค๋ฉด cnt๋ฅผ ๋ฐํํ์ฌ ์ ์ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ์๋ก์ด ๋จ์ง๋ฅผ ์ฐพ์ ์์ ์งํํ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
์ถ๋ ฅ ์์๋ ๊ฐ ๋จ์ง์ ์์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ๊ฐ ๋จ์ง์ ์ง์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐ป์ฝ๋
DFS๋ก ํผ ํ์ด
import sys
input = sys.stdin.readline
N = int(input())
graph = [list(map(int, list(input().strip()))) for _ in range(N)]
res = []
def dfs(y, x):
graph[y][x] = 0
cnt = 1
if 0 <= y + 1 < N and graph[y+1][x] == 1:
cnt += dfs(y+1, x)
if 0 <= x + 1 < N and graph[y][x+1] == 1:
cnt += dfs(y, x+1)
if 0 <= x - 1 < N and graph[y][x-1] == 1:
cnt += dfs(y, x-1)
if 0 <= y - 1 < N and graph[y-1][x] == 1:
cnt += dfs(y-1, x)
return cnt
for y in range(N):
for x in range(N):
if graph[y][x] == 1:
res.append(dfs(y, x))
res.sort()
print(len(res))
print(*res, sep='\n')
BFS๋ก ํผ ํ์ด
import sys
from collections import deque
input = sys.stdin.readline
N = int(input())
graph = [list(map(int, list(input().strip()))) for _ in range(N)]
dy = [-1, 1, 0, 0]
dx = [0, 0, -1, 1]
res = []
def bfs(y, x):
cnt = 1
q = deque()
q.append((y, x))
graph[y][x] = 0
while q:
cy, cx = q.popleft()
for i in range(4):
ny, nx = cy + dy[i], cx + dx[i]
if 0 <= ny < N and 0 <= nx < N and graph[ny][nx] == 1:
graph[ny][nx] = 0
q.append((ny, nx))
cnt += 1
return cnt
for y in range(N):
for x in range(N):
if graph[y][x] == 1:
res.append(bfs(y, x))
res.sort()
print(len(res))
print(*res, sep='\n')
๐ํ๊ธฐ
DFS์ BFS ์ค์ ๋ญ๋ก ํ์ด์ผ ํ ์ง ๊ณ ๋ฏผํ๋๋ฐ ๊ทธ๋ด ํ์๊ฐ ์์๋ค. ์ด ๋ฌธ์ ๋ ๋ ๋ค ์ธ ์ ์์๋ค..๐ฅฒ
'Coding Test > Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 1012. ์ ๊ธฐ๋ ๋ฐฐ์ถ/Python - Silver 2 (0) | 2025.02.06 |
---|---|
[๋ฐฑ์ค] 24480. ์๊ณ ๋ฆฌ์ฆ ์์ - ๊น์ด ์ฐ์ ํ์ 2/Python - Silver 2 (0) | 2025.02.04 |
[ํ๋ก๊ทธ๋๋จธ์ค] ํฐ ์ ๋ง๋ค๊ธฐ/Python - Lv.2 (0) | 2025.01.27 |
[๋ฐฑ์ค] 1753. ์ต๋จ๊ฒฝ๋ก/Python - ๊ณจ๋4 (0) | 2025.01.20 |
[๋ฐฑ์ค] 1449. ์๋ฆฌ๊ณต ํญ์น (0) | 2024.12.21 |