1 λΆ„ μ†Œμš”

πŸ“ [S2_4963] μ„¬μ˜ 개수

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static StringTokenizer st;
    static int[][] arr;
    static int w, h;
    static boolean[][] v;
    static int[] dx = {-1, -1, -1, 0, 1, 1, 1, 0};
    static int[] dy = {-1, 0, 1, 1, 1, 0, -1, -1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        while (true) {
            st = new StringTokenizer(br.readLine(), " ");

            // λ„ˆλΉ„ w, 높이 h
            w = Integer.parseInt(st.nextToken());

            h = Integer.parseInt(st.nextToken());

            if (w == 0 && h == 0) {
                break;
            }

            // 지도
            arr = new int[h][w];

            // 섬인지 μ•„λ‹Œμ§€ check
            v = new boolean[h][w];

            // μ„¬μ˜ 개수
            int cnt = 0;

            // 지도 μž…λ ₯
            for (int i = 0; i < h; i++) {
                st = new StringTokenizer(br.readLine(), " ");
                for (int j = 0; j < w; j++) {
                    arr[i][j] = Integer.parseInt(st.nextToken());
                }
            }

            for (int i = 0; i < h; i++) {
                for (int j = 0; j < w; j++) {
                    if (arr[i][j] == 1 && !v[i][j]) {
                        dfs(j, i);
                        cnt++;
                    }
                }
            }
            sb.append(cnt).append("\n");
        }
        System.out.println(sb);
    }

    static void dfs(int x, int y) {
        v[y][x] = true;

        int nx, ny;
        for (int z = 0; z < 8; z++) {
            nx = x + dx[z];
            ny = y + dy[z];

            if (nx < 0 || ny < 0 || nx >= w || ny >= h) {
                continue;
            } else if (arr[ny][nx] == 1 && !v[ny][nx]) {
                dfs(nx, ny);
            }
        }
    }
}

πŸ€” λ‚˜μ˜ 생각

섬이 κ°€λ‘œ,μ„Έλ‘œ,λŒ€κ°μ„  κΉŒμ§€ 연결이 될 수 μžˆμ–΄μ„œ 8λ°©ν–₯ 탐색을 μ‚¬μš©ν–ˆλ‹€.
그리고 깊이 μš°μ„  탐색을 μ΄μš©ν•˜μ—¬ μ—°κ²°λ˜μžˆλŠ” 곳듀을 νŒŒμ•…ν–ˆλ‹€.
dfs()λ₯Ό ν•œλ²ˆ λ‹€ μ‹€ν–‰ν•΄μ£Όλ©΄ μΉ΄μš΄νŒ…μ„ ν•΄μ£Όμ–΄ 총 μ„¬μ˜ 개수λ₯Ό κ΅¬ν•΄μ£Όμ—ˆλ‹€.
λ°©ν–₯ 탐색과 dfs()λ₯Ό 잘 μ•Œκ³  μžˆλ‹€λ©΄ κ°„λ‹¨ν•˜κ²Œ 풀렸을 λ¬Έμ œμ΄λ‹€.