CS/Algorithm
[백준:2667] 단지번호 붙이기 - JAVA
yujindonut
2021. 5. 2. 19:23
728x90
import java.util.*;
public class Main {
static int N;
static int map[][];
static boolean visit[][];
static int[] xArr = {-1,0,1,0};
static int[] yArr = {0,1,0,-1};
static int apartN;
static int[] aparts = new int[25*25];
public static void dfs(int x, int y) {
visit[x][y] = true;
//dfs가 호출이 될 때마다 apart부분이 증가가 됨!-->이부분 답지 봄
aparts[apartN]++;
for(int i = 0; i < 4; i++) {
int nx = x + xArr[i];
int ny = y + yArr[i];
if(checkLocation(nx,ny)) {
dfs(nx,ny);
}
}
}
public static boolean checkLocation(int x, int y) {
//범위 벗어나면
if(x < 0 || x >= N || y < 0 || y >= N) return false;
//이미 방문한 노드거나 간선이 없는 경우
if(visit[x][y] == true || map[x][y] != 1) return false;
return true;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
N = scan.nextInt();
map = new int [N][N];
visit = new boolean[N][N];
for(int i = 0; i < N; i++) {
String row = scan.next();
for(int j = 0; j < N; j++) {
map[i][j] = row.charAt(j) - '0';
}
}
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
if(map[i][j] == 1 && !visit[i][j]) {
dfs(i,j);
apartN++; //dfs가 호출이 될때마다 분리되어있는 부분
}
}
}
System.out.println(apartN);
Arrays.sort(aparts); //배열을 정렬해주는 것
for(int i = 0; i < aparts.length; i++) {
if(aparts[i] != 0) // 처음에 초기화를 크게 해줘서
System.out.println(aparts[i]);
}
scan.close();
}
}
static int[] xArr = {-1,0,1,0};
static int[] yArr = {0,1,0,-1};
이거를 이용해서 범위 벗어나는지 체크 해주는 부분은 계속 나오는 것 같다.
미로 탐색에서 쓴 개념 이번에도 똑같이 썼음
728x90