白駿-4963島(Java)
18286 ワード
質問の表示
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();
}
}
Reference
この問題について(白駿-4963島(Java)), 我々は、より多くの情報をここで見つけました https://velog.io/@plumwiserim/백준-4963-섬의-개수-Javaテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol