<๋ฌธ์ ๋งํฌ>
https://www.acmicpc.net/problem/2146
2146๋ฒ: ๋ค๋ฆฌ ๋ง๋ค๊ธฐ
์ฌ๋ฌ ์ฌ์ผ๋ก ์ด๋ฃจ์ด์ง ๋๋ผ๊ฐ ์๋ค. ์ด ๋๋ผ์ ๋ํต๋ น์ ์ฌ์ ์๋ ๋ค๋ฆฌ๋ฅผ ๋ง๋ค๊ฒ ๋ค๋ ๊ณต์ฝ์ผ๋ก ์ธ๊ธฐ๋ชฐ์ด๋ฅผ ํด ๋น์ ๋ ์ ์์๋ค. ํ์ง๋ง ๋ง์ ๋ํต๋ น์ ์ทจ์ํ์, ๋ค๋ฆฌ๋ฅผ ๋๋๋ค๋ ๊ฒ์ด ์๊น๋ค
www.acmicpc.net
<ํ์ด ์ ๋ต>
1. ๊ธฐ๋ณธ ์ ๊ทผ์ ๊ฐ๊ฐ์ ์ฌ์ ๋ค๋ฅธ ๋ฒํธ๋ฅผ ๋ถ์ฌํ๊ณ ๊ฐ๊ฐ์ ์ฌ์ ๋ํด์ bfs๋ฅผ ํตํด์ ๋ค๋ฆฌ์ ์ต์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๋ค.
2. ๋ค๋ง ๋ฉ๋ชจ๋ฆฌ์ด๊ณผ๊ฐ ๋๊ธฐ ์ฌ์์ visited๋ฐฐ์ด์ ์ ํ์ฉํด์ผ ํ๋ค. ๋ ๊ฐ์ ๊ฒฝ์ฐ๋ ๋ค๋ฆฌ ๊ฑด์คํ๋ bfs ํจ์ ์์ visited๋ฐฐ์ด์ ํ๋ ๋ง๋ค๊ณ , ์ฌ์ ๋ฒํธ์ ๋ํ visited๋ฐฐ์ด์ ํ๋ ๋ ๋ง๋ค์ด์ ํ ๋ฒ ํ์ํ ์ฌ์ ๋ํด์ ๋ค์ ํ์ํ์ง ์๋๋ก ํ๋ค.
3. ๋ค๋ฆฌ๋ฅผ ๊ฑด์คํ๊ธฐ ์ํด์ ์ฌ ๋ด๋ถ๋ฅผ ํ์ํ ๋๋ ํ์ํ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ํด๋น ์ฌ ๋ด๋ถ๋ฅผ ํ์ํด์ ์ฌ ๋ด๋ถ์ ์์ญ์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๊ณ bfs ํ์์ ์ค์ํ๋ค.
<์ ๋ต ์ฝ๋>
from collections import deque
import sys, os, io, atexit
input = lambda: sys.stdin.readline().rstrip('\r\n')
stdout = io.BytesIO()
sys.stdout.write = lambda s: stdout.write(s.encode("ascii"))
atexit.register(lambda: os.write(1, stdout.getvalue()))
# 220927 2146 ๋ค๋ฆฌ ๋ง๋ค๊ธฐ
# ์ ๋ต์ฝ๋
# ๋ธํ ํ์ ๋ฐฉํฅ ์ค์
dr = [-1, 1, 0, 0]
dc = [0, 0, -1, 1]
# ์ฌ์ ๊ฐ๊ฐ ๋ฒํธ๋ฅผ ๋ถ์ฌํ๋ ํจ์
def bfs_island(r, c, idx):
# ๋ฐฉ๋ฌธ ํ์ ๋ฐ ๋ฒํธ ํ์
arr[r][c] = idx
visited[r][c] = 1
queue = deque()
queue.append((r, c))
while queue:
r, c = queue.popleft()
for i in range(4):
nr = r + dr[i]
nc = c + dc[i]
if 0 <= nr < N and 0 <= nc < N:
# ์ฌ ๋ด์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ์ก์ง๊ฐ ์์ ๊ฒฝ์ฐ
if visited[nr][nc] == 0 and arr[nr][nc] == 1:
# ๋ฒํธ ๋ถ์ฌํ๊ณ ๋ฐฉ๋ฌธ ํ์
arr[nr][nc] = idx
visited[nr][nc] = 1
queue.append((nr, nc))
return
# bfs๋ก ๋ค๋ฆฌ ์ฐ๊ฒฐํ๋ ํจ์
def bfs_bridge(r, c, island_num):
# visited: ๋ฐฉ๋ฌธ ์ฌ๋ถ ํ์ ๋ฐฐ์ด
visited = [[0 for _ in range(N)] for _ in range(N)]
queue = deque()
# ์ ํํ ์ฌ์ ๋จผ์ ๋ค ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๊ณ ํ์ ๋ฃ์ด์ค๋ค.
for r in range(N):
for c in range(N):
if arr[r][c] == island_num:
queue.append((r, c, 0))
visited[r][c] = 1
while queue:
r, c, cnt = queue.popleft()
for i in range(4):
nr = r + dr[i]
nc = c + dc[i]
if 0 <= nr < N and 0 <= nc < N and visited[nr][nc] == 0:
# ๋ฐ๋ค์ผ ๊ฒฝ์ฐ ๋ค๋ฆฌ ๊ธธ์ด๋ฅผ ์ธ์ฃผ๋ฉด์ ํ์
if arr[nr][nc] == 0:
visited[nr][nc] = 1
queue.append((nr, nc, cnt + 1))
# ๋ค๋ฅธ ์ฌ์ ๋ง๋ฌ์ ๊ฒฝ์ฐ ๋ค๋ฆฌ ๊ธธ์ด ๋ฐํ
elif arr[nr][nc] != island_num:
return cnt
# N: ๋ฐฐ์ด์ ํฌ๊ธฐ, arr: ์ฌ ๋ฐฐ์ด
N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
# idx: ์ฌ์ ๋ฒํธ, visited: ๋ฐฉ๋ฌธ ์ฌ๋ถ ํ์ ๋ฐฐ์ด(์ฌ ๋ฒํธ ๋ถ์ฌ ์)
idx = 1
visited = [[0 for _ in range(N)] for _ in range(N)]
# ๋ฐฐ์ด์ ํ์ํ๋ฉด์ ์ฌ์ ๋ฒํธ๋ฅผ ๋ถ์ฌํด์ค๋ค.
for r in range(N):
for c in range(N):
if arr[r][c] == 1 and visited[r][c] == 0:
bfs_island(r, c, idx)
# ํ๋์ ์ฌ์ ํ์ํ์ ๊ฒฝ์ฐ ๋ค์ ๋ฒํธ
idx += 1
# island_visited: ๋ค๋ฆฌ ๊ฑด์ค ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ฐฐ์ด
island_visited = [0 for _ in range(idx)]
# ans: ๋ค๋ฆฌ์ ์ต์ ๊ธธ์ด (์ถฉ๋ถํ ํฐ ๊ฐ์ผ๋ก ์ด๊ธฐํ)
ans = sys.maxsize
for r in range(N):
for c in range(N):
# ๋ค๋ฆฌ๋ฅผ ๊ฑด์คํ์ง ์์ ์ฌ์ ๋ํด์ bfs๋ก ๋ค๋ฆฌ ๊ฑด์ค
if arr[r][c] != 0 and island_visited[arr[r][c]] == 0:
island_num = arr[r][c]
island_visited[island_num] = 1
# ์ต์๊ฐ ๊ฐฑ์
ans = min(ans, bfs_bridge(r, c, island_num))
# ์ ๋ต ์ถ๋ ฅ
print(ans)
'โญ Problem_Solving > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 14621 ๋๋ง ์๋๋ ์ฐ์ (Python/ํ์ด์ฌ) (1) | 2022.10.02 |
---|---|
[๋ฐฑ์ค] 16724 ํผ๋ฆฌ ๋ถ๋ ์ฌ๋์ด (Python/ํ์ด์ฌ) (0) | 2022.10.02 |
[๋ฐฑ์ค] 20055 ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ์์ ๋ก๋ด (Python/ํ์ด์ฌ) (1) | 2022.09.30 |
[๋ฐฑ์ค] 2212 ์ผ์ (Python/ํ์ด์ฌ) (2) | 2022.09.29 |
[๋ฐฑ์ค] 3190 ๋ฑ (Python/ํ์ด์ฌ) (0) | 2022.09.28 |
๋๊ธ