Algorithm

[λ°±μ€€] 4963. μ„¬μ˜ 개수 python

🐳 링크

λ°±μ€€ 4963번 μ„¬μ˜ 개수

πŸ• 문제

μ •μ‚¬κ°ν˜•μœΌλ‘œ 이루어져 μžˆλŠ” 섬과 λ°”λ‹€ 지도가 주어진닀. μ„¬μ˜ 개수λ₯Ό μ„ΈλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

ν•œ μ •μ‚¬κ°ν˜•κ³Ό κ°€λ‘œ, μ„Έλ‘œ λ˜λŠ” λŒ€κ°μ„ μœΌλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ” μ‚¬κ°ν˜•μ€ κ±Έμ–΄κ°ˆ 수 μžˆλŠ” μ‚¬κ°ν˜•μ΄λ‹€.

두 μ •μ‚¬κ°ν˜•μ΄ 같은 섬에 있으렀면, ν•œ μ •μ‚¬κ°ν˜•μ—μ„œ λ‹€λ₯Έ μ •μ‚¬κ°ν˜•μœΌλ‘œ κ±Έμ–΄μ„œ 갈 수 μžˆλŠ” κ²½λ‘œκ°€ μžˆμ–΄μ•Ό ν•œλ‹€. μ§€λ„λŠ” λ°”λ‹€λ‘œ λ‘˜λŸ¬μ‹Έμ—¬ 있으며, 지도 λ°–μœΌλ‘œ λ‚˜κ°ˆ 수 μ—†λ‹€.

🐾 풀이 방법

κ·Έλž˜ν”„ 문제 쀑 κ°„λ‹¨ν•œ λ¬Έμ œμ΄λ‹€.
dx, dy에 μƒν•˜μ’Œμš° + λŒ€κ°μ„ μ„ μΆ”κ°€ν•˜μ—¬ μžμ‹  κΈ°μ€€μœΌλ‘œ 총 8λ²ˆμ„ 탐색할 수 μžˆλ„λ‘ ν•΄μ€€λ‹€. μ—°κ²°λ˜μ–΄μžˆμœΌλ©΄ 계속 μ§„ν–‰ν•˜κ³ , λŒ€μ‹  μžμ‹ μ„ 0으둜 λ§Œλ“  λ’€ λ‹€μŒ λ…Έλ“œλ‘œ 진행해쀀닀. 이미 μ—°κ²°λ˜μ—ˆλ‹€κ³  μƒκ°ν•˜λ―€λ‘œ graphμ—μ„œ 0κ°’μœΌλ‘œ λ°”κΎΈμ–΄μ£ΌλŠ” 것이닀.
dfsκ°€ ν•œλ²ˆ μ’…λ£Œλ˜λ©΄, cntλ₯Ό 1 증가 μ‹œμΌœμ€€λ‹€.

solution μ½”λ“œ

import sys
sys.stdin = open("input.txt","rt")
sys.setrecursionlimit(10**5)

dx = [-1, 1, 0, 0, -1, 1, -1, 1]
dy = [0, 0, -1, 1, -1, 1, 1, -1]

def dfs(x,y):
    visit[x][y] = 1

    for i in range(8):
        nx = x + dx[i]
        ny = y + dy[i]

        if 0 <= nx < h and 0 <= ny < w and visit[nx][ny] == 0 and graph[nx][ny] == 1:
            graph[nx][ny] = 0
            dfs(nx,ny)


while True:
    w, h = map(int, sys.stdin.readline().split())
    if w == 0 and h == 0:
        break

    visit = [[0] * w for _ in range(h)]
    graph = []
    for _ in range(h):
        graph.append(list(map(int, sys.stdin.readline().split())))

    cnt = 0
    for i in range(h):
        for j in range(w):
            if visit[i][j] == 0 and graph[i][j] == 1:
                dfs(i, j)
                cnt += 1

    print(cnt)