단지번호붙히기라는 문제이다. 간단하게 설명하자면,
아래 그림과 같이 1이 모여있는 부분의 크기를 찾고 오름차순으로 정렬하라는 문제이다.
생각보다 오래걸린 문제였다.
단순하게 주변을 둘러보며 찾는것을 꺼리고 뭔가 더 좋은 방법이 있지 않을까 너무 오랜시간 고민했기 때문이다.
혹시나 하는 마음에 풀이를 봤더니... 좀 실망스러웠다. 정말 단순하게 찾는 문제였기 때문이다.
그렇게 방법을 알고 나서 문제를 풀었고, 아래와 같은 코드가 나왔다.
import java.io.*;
import java.util.*;
public class 단지번호붙이기_2667번 {
static int N;
static int[][] map;
static boolean[][] visited;
static int[] dx = {0,0,-1,1};
static int[] dy = {-1,1,0,0};
static int sum;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
N = Integer.parseInt(br.readLine());
map = new int[N][N];
for (int i = 0; i < N; i++) {
String line = br.readLine();
for (int j = 0; j < N; j++) {
map[i][j] = line.charAt(j) - '0';
}
}
PriorityQueue<Integer> queue = new PriorityQueue<>();
visited = new boolean[N][N];
sum = 1;
for(int x=0;x<N;x++) {
for(int y=0;y<N;y++) {
if(map[x][y]==1 && !visited[x][y]) {
dfs(x,y);
queue.add(sum);
sum = 1;
}
}
}
bw.write(queue.size()+"\n");
while (!queue.isEmpty()) {
bw.write(queue.poll()+"\n");
}
bw.flush();
bw.close();
}
public static void dfs(int x, int y) {
visited[x][y] = true;
for(int i=0;i<4;i++) {
int nx = dx[i]+x;
int ny = dy[i]+y;
if(nx>=0 && ny>=0 && nx<N && ny<N && !visited[nx][ny] && map[nx][ny]==1) {
sum++;
dfs(nx,ny);
}
}
}
}
즉 sum이 더해질동안 계속해서 4 방향을 검사하고 만일 1이 있다면 이미 간 경로에 기록해두며 sum++를 하는 것이다.
풀이를 보며 조금 새롭다고 느낀 것은 배열에 dx, dy를 저장시켜 코드를 간소화 한 점이다.
앞으로 이런 문제가 있으면 적극 채용해야겠다. 코드가 덕분에 많이 간소화 된 듯 하다.
'알고리즘 > 백준' 카테고리의 다른 글
17070번 - 파이프 옮기기 (0) | 2024.07.18 |
---|---|
1038번 - 감소하는 수 (0) | 2024.07.18 |
2293번, 2294번 - 동전1,2(규칙성 찾기) (0) | 2024.07.17 |
1789번, 3085번 - 브루트포스 (0) | 2024.07.16 |
2252번 - 줄세우기(bfs) (0) | 2024.07.11 |