문제

문제 이해하기
- N의 크기가 작고 2차원 배열을 모두 탐색 해야하기에 DFS 사용
- 완전 탐색하면서 1과 인접한 단지의 크기를 리턴해야한다.
- 크기들을 오름차순 정렬해서 출력해야한다.
코드
import java.io.*;
import java.util.*;
public class 단지번호붙이기 {
static int[][] arr;
static boolean[][] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
arr = new int[N][N];
visited = new boolean[N][N];
for(int i = 0; i < N; i++){
String[] strArr = br.readLine().split("");
for(int j = 0; j < strArr.length; j++) {
arr[i][j] = Integer.parseInt(strArr[j]);
}
}
List<Integer> result = new ArrayList<>();
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
if(arr[i][j] == 1 && !visited[i][j]){
result.add(dfs(i, j));
}
}
}
Collections.sort(result);
System.out.println(result.size());
for (int size : result) {
System.out.println(size);
}
}
static int dfs(int row, int column) {
visited[row][column] = true;
int[] dx = {-1, 1, 0, 0};
int[] dy = {0, 0, -1, 1};
int count = 1;
for(int i =0; i< 4; i++){
int nx = row + dx[i];
int ny = column + dy[i];
if (nx >= 0 && ny >= 0 && nx < arr.length && ny < arr.length) {
if (!visited[nx][ny] && arr[nx][ny] == 1) {
count += dfs(nx, ny);
}
}
}
return count;
}
}
'Algorithm' 카테고리의 다른 글
[백준-골드]두 용액 (BOJ 2470) (0) | 2025.01.17 |
---|---|
[백준-실버] 기타 레슨 (BOJ 2343) (1) | 2025.01.16 |
[백준-실버] 선분 위의 점(BOJ 11663) (1) | 2025.01.15 |
[백준-실버] 암기왕 (BOJ 2776) (0) | 2025.01.13 |