알고리즘/백준
백준-2667번/단지번호붙이기(java)
연향동큰손
2024. 7. 23. 21:52
문제 이해
연결성분을 구하는 과정과 유사하기 때문에 dfs의 성질을 이용하여 풀어야겠다고 생각 하였다.
이동은 위,아래,좌,우 만 가능하다
따라서 이차원 배열에서 x좌표를 +1,-1하거나 y좌표를 +1,-1하는 방식으로 이동을 할 수 있다는 뜻이다.
문제 해결
<위,아래로 움직일 수 있도록 해주는 배열 dx,dy>
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
<dfs 구현>
public static void dfs(int x, int y) {
arr[x][y] = 0;
count += 1;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < N && ny >= 0 && ny < N && arr[nx][ny] == 1) {
dfs(nx, ny);
}
}
}
arr[dx][dy]가 1 일때만 이동하여서 연결성분을 알아낼수있도록 하였고, if문에 조건을 넣어서 배열의 영역을 벗어나지 않도록 하였고, count값을 집에 방문 할때마다 증가시켜줬다.
count ==> 단지 내 집의 수
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (arr[i][j] == 1) {
count = 0;
dfs(i, j);
Home.add(count);
danji++;
}
}
}
메인 함수에서는 배열을 순회하면서 dfs 수행하고 count를 ArrayList에 추가해준다.
<전체 코드>
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
public class Problem2667_2 {
static int N, count;
static int[][] arr;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N][N];
ArrayList<Integer> Home = new ArrayList<>();
int danji = 0;
for (int i = 0; i < N; i++) {
String str = br.readLine();
for (int j = 0; j < N; j++) {
arr[i][j] = str.charAt(j) - '0';
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (arr[i][j] == 1) {
count = 0;
dfs(i, j);
Home.add(count);
danji++;
}
}
}
Collections.sort(Home);
System.out.println(danji);
for (int i : Home) {
System.out.println(i);
}
}
public static void dfs(int x, int y) {
arr[x][y] = 0;
count += 1;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < N && ny >= 0 && ny < N && arr[nx][ny] == 1) {
dfs(nx, ny);
}
}
}
}