白駿-4963島(Java)


質問の表示
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    private static int width;
    private static int height;
    private static int[][] array;
    private static boolean[][] visited;
    private static int[] d_col = {-1, -1, -1, 0, 0, 1, 1, 1};
    private static int[] d_row = {-1, 0, 1, -1, 1, -1, 0, 1};

    public static void solution() throws IOException {
        
        // 문자열을 미리 선언해두고 매번 입력받을 때마다 "0 0"이 아니면 계속 입력받기 
        String str = "";
        while (!(str = br.readLine()).equals("0 0")) {
            
            width = Integer.parseInt(str.split(" ")[0]);
            height = Integer.parseInt(str.split(" ")[1]);
            
            // 입력받은 배열의 크기만큼 배열 선언하기
            array = new int[height][width];
            // 배열의 요소들의 방문여부를 저장할 배열 선언하기
            visited = new boolean[height][width];
            
            // 배열에 요소 저장하기
            for (int i = 0; i < height; i++) {
                String[] row = br.readLine().split(" ");
                for (int j = 0; j < width; j++) {
                    array[i][j] = Integer.parseInt(row[j]);
                }
            }
            
            // 🚩 이 문제의 핵심 
            // 배열의 요소를 일일이 찾아가서 
            // 방문하지 않은 땅이면 
            // 인접한 땅들을 찾아서 섬의 개수를 증가시킨다. 
            int count = 0;
            for (int i = 0; i < height; i++) {
                for (int j = 0; j < width; j++) {
                    if (!visited[i][j] && array[i][j] == 1) {
                        findIsland(i, j);
                        count++;
                    }
                }
            }
            System.out.println(count);
        }
    }

    public static void findIsland(int row, int column) {
    	
        // 시작 땅 방문 표시
        visited[row][column] = true;

	// 시작한 땅의 사방팔방 중에서
        for (int i = 0; i < 8; i++) {
            int next_row = row + d_row[i];
            int next_column = column + d_col[i];

	    // 지도 안에 드는 땅만 추려서
            if (next_row >= 0 && next_row < height && next_column >= 0 && next_column < width) {
            	// 방문하지 않은 땅에 대해서 한 번 더 찾기
                if (array[next_row][next_column] == 1 && !visited[next_row][next_column]) {
                    findIsland(next_row, next_column);
                }
            }
        }
    }

    public static void main(String[] args) throws IOException {
        solution();
    }
}