문제 분석
- 2차원 좌표에서 점점 퍼져나가면서 체크하기때문에 bfs로 구현한다.
문제 풀이
1) 단지 수와 단지에 포함되는 아파트 수를 계산해야하기때문에 변수를 잘 설정해준다.
2) 만약 조건에 충족할 경우(map[i][j]==1 && !visited[i][j])는 단지를 ++해주고 bfs를 계산하러 간다.
3) bfs를 통해 탐색하고, 아파트의 개수를 apartNum배열에 해당 단지를 인덱스로 하여 ++해준다.
4) bfs 탐색 후 각 아파트의 수가 들어있는 배열(apartNum)을 정렬하고(오름차순 출력을 위해), 단지를 출력 후 단지에 속하는 아파트의 수를 출력한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
private static boolean[][] visited;
private static int[] apartNum;
private static int N, danNum;
private static int[][] map;
private static int[] dr = { -1, 1, 0, 0 }; // 좌우상하
private static int[] dc = { 0, 0, -1, 1 };
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
map = new int[N][N];
visited = new boolean[N][N];
apartNum = new int[N * N];
for (int i = 0; i < N; i++) {
String s = br.readLine();
for (int j = 0; j < N; j++) {
map[i][j] = s.charAt(j) - '0';
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (map[i][j] == 1 && !visited[i][j]) {
danNum++;
bfs(i, j);
}
}
}
Arrays.sort(apartNum);
System.out.println(danNum);
for (int i = 0; i < apartNum.length; i++) {
if (apartNum[i] != 0) {
System.out.println(apartNum[i]);
}
}
}// main
private static void bfs(int x, int y) {
Queue<Point> q = new LinkedList<>();
q.add(new Point(x, y));
visited[x][y] = true;
apartNum[danNum]++;
while (!q.isEmpty()) {
Point cur = q.poll();
int curX = cur.x;
int curY = cur.y;
for (int d = 0; d < 4; d++) { // 상하좌우
int nx = curX + dr[d];
int ny = curY + dc[d];
if (nx >= 0 && ny >= 0 && nx < N && ny < N) {
if (map[nx][ny] == 1 && !visited[nx][ny]) {
q.add(new Point(nx, ny));
visited[nx][ny] = true;
apartNum[danNum]++;
}
}
}
}
}// bfs
static class Point {
int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}// Point
}// class-end
'Algorithm > BOJ' 카테고리의 다른 글
BOJ 7576 토마토 (0) | 2021.03.17 |
---|---|
BOJ 2468 안전영역 (0) | 2021.03.17 |
BOJ_16637_괄호 추가하기 (0) | 2021.03.12 |
BOJ 10157 자리배정 (0) | 2021.03.08 |
BOJ 2527 직사각형 (0) | 2021.03.08 |