[백준] 4963번 섬의 개수 Java

dustle·2023년 3월 22일
1

섬의 개수

dfs로 인접한 섬을 계산하는 간단한 문제입니다.

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

public class Main {
    public static int[] x = {1, 1, 1, 0, 0, -1, -1, -1};
    public static int[] y = {1, -1, 0, 1, -1, 1, -1, 0};
    public static int[][] map;
    public static boolean[][] visited;
    public static int N = Integer.MAX_VALUE;
    public static int M = Integer.MAX_VALUE;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        while(true){
            st = new StringTokenizer(br.readLine());
            M = Integer.parseInt(st.nextToken());
            N = Integer.parseInt(st.nextToken());

            if(M == 0 && N == 0) break;

            map = new int[N][M];
            visited = new boolean[N][M];

            for(int i = 0; i < N; i++){
                st = new StringTokenizer(br.readLine());
                for(int j = 0; j < M; j++){
                    int tmp = Integer.parseInt(st.nextToken());
                    map[i][j] = tmp;
                    visited[i][j] = false;
                }
            }
            int cnt = 0;
            for(int i = 0; i < N; i++){
                for(int j = 0; j < M; j++){
                    if(map[i][j] == 1 && !visited[i][j]){
                        dfs(i, j);
                        cnt++;
                    }
                }
            }

            System.out.println(cnt);

        }
    }

    private static void dfs(int n, int m) {
        visited[n][m] = true;

        for(int i = 0; i < 8; i++){
            int tmpX = x[i] + n;
            int tmpY =y[i] + m;

            if(tmpX >= 0 && tmpX < N && tmpY >= 0 && tmpY < M){
                if(map[tmpX][tmpY] > 0 && !visited[tmpX][tmpY]) dfs(tmpX, tmpY);
            }
        }
    }
}

0개의 댓글