백준 4963 - 섬의 개수

Updated:

Java

4963 번 - 섬의 개수

문제

접근 방법

0,0 부터 n - 1, m - 1 까지 좌표를 탐색하며, 방문하지 않았고, 섬일 경우 BFS로 근처의 갈 수 있는 모든 섬을 탐색한다. 만약 각 섬을 탐색할 때마다(BFS 탐색할 때 마다) 개수를 증가하여 총 섬의 개수를 센다.

코드

import java.util.*;
import java.io.*;

public class Main {
    static int n,m;
    static int[][] map;
    static boolean[][] vis;
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        

        StringBuilder sb = new StringBuilder();

        while(true){
            StringTokenizer stk = new StringTokenizer(br.readLine());
            int cnt = 0;
            m = stoi(stk.nextToken());  // 너비
            n = stoi(stk.nextToken());  // 높이
            if(n == 0 && m == 0)
                break;

            map = new int[n][m];    
            vis = new boolean[n][m];

            for(int i = 0; i < n; i++) {
                stk = new StringTokenizer(br.readLine());
                for(int j = 0; j < m; j++) {
                    map[i][j] = stoi(stk.nextToken());
                }
            }

            for(int i = 0; i < n; i++) {
                for(int j = 0; j < m; j++) {
                    if(map[i][j] == 1 && !vis[i][j]) {
                        BFS(i,j);
                        cnt++;
                    }
                }
            }

            sb.append(cnt).append("\n");
        }
        
        System.out.print(sb.toString());
    }
    static int[] dy = {1,1,1,0,0,-1,-1,-1};
    static int[] dx = {-1,0,1,-1,1,-1,0,1};

    private static void BFS(int y, int x) {
        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[] {y,x});

        int ny, nx;
        while(!queue.isEmpty()){
            int[] q = queue.poll();
            for(int i = 0; i < 8; i++) {
                ny = q[0] + dy[i];
                nx = q[1] + dx[i];
                if(isIn(ny, nx) && !vis[ny][nx] && map[ny][nx] == 1) {
                    vis[ny][nx] = true;
                    queue.add(new int[] {ny,nx});
                }
            }
        }
    }

    static boolean isIn(int y, int x){
        if(0 <= y && y < n && 0 <= x && x < m)
            return true;

        return false;
    }

    static int stoi(String str){
        return Integer.parseInt(str);
    }
}