๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 2146 ๋‹ค๋ฆฌ ๋งŒ๋“ค๊ธฐ (Python/ํŒŒ์ด์ฌ)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 10. 1.

<๋ฌธ์ œ ๋งํฌ>

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)

๋Œ“๊ธ€