본문 바로가기
백준

[python] 2146. 다리 만들기

by DylanMsK 2019. 10. 17.

문제 출처

2146. 다리 만들기

 

풀이


from collections import deque

# 섬에 넘버링
def numbering_irlands(x, y):
    arr[y][x] = irland
    q = deque()
    q.append((x, y))
    while q:
        x, y = q.popleft()
        visited[y][x] = 1

        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if nx < 0 or nx >= N or ny < 0 or ny >= N:
                continue
            if not visited[ny][nx] and arr[ny][nx]:
                arr[ny][nx] = irland
                q.append((nx, ny))
                visited[ny][nx] = 1


def get_min_distance(irland):
    global min_

    distance = [[-1]*N for _ in range(N)]
    q = deque()
    for y in range(N):
        for x in range(N):
            if arr[y][x] == irland:
                q.append((x, y))
                distance[y][x] = 0

    while q:
        x, y = q.popleft()
        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if nx < 0 or nx >= N or ny < 0 or ny >= N:
                continue
            if arr[ny][nx] != irland and arr[ny][nx]:
                min_ = min(min_, distance[y][x])
                return
            if distance[ny][nx] == -1 and not arr[ny][nx]:
                distance[ny][nx] = distance[y][x] + 1
                q.append((nx, ny))


N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
visited = [[0]*N for _ in range(N)]
dx, dy = (1, 0, -1, 0), (0, 1, 0, -1)
min_, irland = 1e9, 1

for y in range(N):
    for x in range(N):
        if not visited[y][x] and arr[y][x]:
            numbering_irlands(x, y)
            irland += 1

for i in range(1, irland):
    get_min_distance(i)

print(min_)

'백준' 카테고리의 다른 글

[python] 17143. 낚시왕  (0) 2019.10.19
[python] 17472. 다리 만들기 2  (0) 2019.10.19
[python] 9375. 패션왕 신해빈  (0) 2019.10.12
[python] 4949. 균형잡힌 세상  (0) 2019.10.05
[python] 9461. 파도반 수열  (0) 2019.10.03