파게로그
[백준 2667번] 단지 번호 붙이기 본문
문제 링크: 2667번 단지번호붙이기
https://www.acmicpc.net/problem/2667
흔히 말하는 섬 개수와, 각 섬의 면적을 구하는 문제이다. 이 문제에서 섬 개수는 단지의 수, 각 섬의 면적은 각 단지의 집의 수를 뜻한다.
DFS 함수 진입 후, 해당 칸이 집이 없는 칸이라면 즉 map[row][col] != 1
이라면 함수를 빠져나온다. 그렇지 않을 때에는 해당 칸을 '집이 있으며, 방문을 하였음'이라는 의미로 2로 바꾸어준다. 그리고 집이 있는 칸을 방문하였기에 면적을 1만큼 더해준다. 그 후 지도의 범위를 벗어나지 않는, 동서남북 방향의 칸에 대해서 DFS 함수를 호출하고, 호출된 함수가 반환하는 areaSize
값을 호출한 함수의 areaSize
에 할당한다. 이렇게 하면 가장 처음에 호출된 DFS 함수는 해당 단지의 전체 면적을 반환한다. 이 때 반환된 면적이 1 이상이면 단지가 존재하는 것이므로 단지들의 크기를 저장해두는 리스트인 areaSizes
에 추가해준다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
static int[] drow = {0, 0, 1, -1};
static int[] dcol = {1, -1, 0, 0}; // 동서남북
public static int dfs(int row, int col, int n, int[][] map, int areaSize) {
if (map[row][col] != 1) return areaSize;
map[row][col] = 2;
areaSize++;
for (int d = 0; d < 4; d++) {
int nrow = row + drow[d];
int ncol = col + dcol[d];
if (nrow<0||ncol<0||nrow>=n||ncol>=n) continue;
areaSize = dfs(nrow, ncol, n, map, areaSize);
}
return areaSize;
}
public static void main(String[] args) throws IOException {
/* input */
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int[][] map = new int[n][n];
for (int i = 0; i < n; i++) {
String t = br.readLine();
for (int j = 0; j < n; j++)
map[i][j] = (int)t.charAt(j) - '0';
}
/* logic */
int areaNum = 0;
ArrayList<Integer> areaSizes = new ArrayList<>();
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
if (map[i][j] == 1) {
int cur = dfs(i, j, n, map, 0);
if (cur < 1) continue;
areaSizes.add(cur);
areaNum++;
}
}
Collections.sort(areaSizes);
StringBuilder sb = new StringBuilder();
sb.append(areaNum).append("\n");
for (int item : areaSizes)
sb.append(item).append("\n");
System.out.println(sb);
}
}
'콤퓨타 왕왕기초 > PS' 카테고리의 다른 글
[백준 2178번] 미로 탐색 (0) | 2020.12.30 |
---|---|
[백준 1012번] 유기농 배추 (0) | 2020.12.29 |
[백준 2606번] 바이러스 (0) | 2020.12.28 |
[백준 1260번] DFS와 BFS (0) | 2020.12.28 |
[백준 2293번] 동전 1 (0) | 2020.12.18 |
Comments