백준
BOJ_2667 단지번호붙이기
양갱이요
2023. 2. 19. 22:00
백준 링크 : https://www.acmicpc.net/problem/2667
필요 알고리즘 개념 : DFS, 연결그래프
지도의 각 칸들을 반복문으로 순회하면서 '1' 칸을 만나면, 그 칸과 인접한 칸들을 탐색하는 DFS 탐색을 시작한다.
DFS 탐색하면서 만나는 '1' 칸들의 값을 단지번호로 바꾼다. ('2', '3', '4',...) 칸들의 값을 단지번호로 바꾸는 이유는, 그 칸들이 다시 DFS 탐색 대상이 되지 않기 위함이다.
DFS 메소드는, 값을 바꾼 칸들의 수를 리턴한다.
리턴된 칸들의 수를 ArrayList에 저장하고, 정렬하여 출력한다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main {
static char[][] map;
static int DFS(int r, int c, char no) {
if (r < 0 || r >= map.length) return 0;
if (c < 0 || c >= map[0].length) return 0;
if (map[r][c] != '1') return 0; // 이미 방문한 칸이면 무시
map[r][c] = no;
int count = 1; // 현재 칸의 수 1부터 시작
count += DFS(r - 1, c, no); // 방문한 칸들의 수를 누적한다
count += DFS(r + 1, c, no);
count += DFS(r, c - 1, no);
count += DFS(r, c + 1, no);
return count; // 방문한 칸들의 수 리턴
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
map = new char[N][];
for (int r = 0; r < N; ++r)
map[r] = scanner.next().toCharArray();
ArrayList<Integer> result = new ArrayList<>();
char no = '2';
for (int r = 0; r < N; ++r)
for (int c = 0; c < N; ++c)
if (map[r][c] == '1')
result.add(DFS(r, c, no++));
Collections.sort(result);
System.out.println(result.size());
for (int i : result)
System.out.println(i);
scanner.close();
}
}