단지 번호를 붙일 때, dirX 좌 우를 판단, dirY 상 하의 범위를 판단
nowX
와 nowY
는 범위를 계산한 좌표를 담을 변수arr
에서 1인 곳을 만날경우 다시 DFS() 메소드가 실행되도록 하면 arr
전체를 탐색할 수 있다.import java.io.*;
import java.util.*;
public class Main {
static int arr[][];
static boolean visit[][];
static int dirX[] = {0, 0, -1, 1};
static int dirY[] = {-1, 1, 0, 0};
static int count = 0, number =0;
static int nowX, nowY, N ;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
List<Integer> list = new ArrayList<>();
N = Integer.parseInt(br.readLine());
arr = new int[N][N];
visit = new boolean[N][N];
for (int i = 0; i < N; i++) {
String str = br.readLine();
for (int j = 0; j < N; j++) {
arr[i][j] = Character.getNumericValue(str.charAt(j));
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (visit[i][j] == false && arr[i][j] == 1) {
count = 0;
number++;
DFS(i, j);
list.add(count);
}
}
}
Collections.sort(list);
bw.append(number + "\n");
for (int num : list) {
bw.append(num + "\n");
}
bw.flush();
bw.close();
}
static void DFS(int x, int y) {
visit[x][y] =true;
arr[x][y] = number;
count++;
for (int i = 0; i < 4; i++) {
nowX = dirX[i] +x;
nowY = dirY[i] + y;
if (check() && visit[nowX][nowY] == false && arr[nowX][nowY] == 1) {
visit[nowX][nowY] = true;
arr[nowX][nowY] = number;
DFS(nowX, nowY);
}
}
}
static boolean check() {
return (nowX >= 0 && nowX < N && nowY >=0 && nowY < N);
}
}
참조 : https://velog.io/@lifeisbeautiful/Java-백준-2667번-단지번호붙이기-자바