[백준] 단지번호붙이기 (Java)
https://www.acmicpc.net/problem/2667
입력 : 첫 번째 줄 -지도의 크기 N (가로/세로 동일, 5 ≤ N ≤ 25)
N 번째 줄 - N개의 자료(0 또는 1)
출력 : 첫 번째 줄 - 총 단지수
두 번째 줄부터 - 각 단지내 집의 수를 오름차순으로 정렬해 하나씩 출력
O(n^2)
n : 그리드 크기
DFS
없음
없음
구현
import java.util.*;
public class Main {
static int n; // 그리드의 크기
static int[][] map; // 그리드 맵
static boolean[][] visited; // 방문 체크를 위한 배열
static int[] dx = {1, -1, 0, 0}; // x 방향 이동 (오른쪽, 왼쪽)
static int[] dy = {0, 0, 1, -1}; // y 방향 이동 (아래, 위)
static int count; // 현재 단지에 포함된 집의 수
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
map = new int[n][n];
visited = new boolean[n][n];
// 그리드 입력 받기
for (int i = 0; i < n; i++) {
String line = sc.next();
for (int j = 0; j < n; j++) {
map[i][j] = line.charAt(j) - '0';
}
}
ArrayList<Integer> complexSizes = new ArrayList<>(); // 단지 크기를 저장할 리스트
// 모든 위치에 대해 DFS 실행
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!visited[i][j] && map[i][j] == 1) {
count = 0; // 새로운 단지를 탐색 시작
dfs(i, j);
complexSizes.add(count); // 탐색이 끝난 후 단지 크기 추가
}
}
}
Collections.sort(complexSizes); // 단지 크기를 오름차순으로 정렬
System.out.println(complexSizes.size()); // 총 단지 수 출력
for (int size : complexSizes) {
System.out.println(size); // 각 단지의 크기 출력
}
}
// DFS를 사용하여 단지 탐색
static void dfs(int x, int y) {
visited[x][y] = true; // 현재 위치 방문 체크
count++; // 집의 수 증가
// 네 방향 탐색
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
// 그리드 범위 안에 있는지 확인하고, 방문하지 않았으며 집이 있는 곳(1)인지 확인
if (nx >= 0 && ny >= 0 && nx < n && ny < n) {
if (!visited[nx][ny] && map[nx][ny] == 1) {
dfs(nx, ny);
}
}
}
}
}