반응형
문제
https://www.acmicpc.net/problem/2573
풀이
1. 빙산이 몇 조각인지 dfs로 탐색한다.
2. 0 조각일 경우, 알고리즘을 마친다. 한 조각일 경우, 빙산 녹이는 함수를 돌린다. 두 조각 이상일 경우, result를 출력하고 끝낸다.
3. 빙산을 녹이는 함수는 사방의 함수를 탐색하여 counting하여 temp배열에 넣는다.
4. 빙산 배열에서 temp배열에 카운팅된 수들을 빼준다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | package algorithm_DFS; import java.util.Scanner; public class q_2573 { static int[] dx = {-1, 1, 0, 0}; static int[] dy = {0, 0, -1, 1}; static int n, m; public static int[][] iceberg; static int[][] melting_layer; static boolean[][] checked= new boolean[301][301]; static int[][] temp; static int cnt = 0; public static int melting_ice(int x, int y) { int cnt = 0; for(int i=0;i<4;i++) { int mx = x + dx[i]; int my = y + dy[i]; if(mx<0 || mx>=n || my<0 || my>=m) continue; if(iceberg[mx][my]<=0) { if(iceberg[x][y]>0) { ++cnt; } } } return cnt; } public static int component_num() { int comp = 0; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(!checked[i][j] && iceberg[i][j]>0) { ++comp; dfs(i,j); } } } return comp; } public static void dfs(int x, int y) { checked[x][y] =true; for(int i=0;i<4;i++) { int nx = dx[i] + x; int ny = dy[i] + y; if(nx<0||nx>=n||ny<0||ny>=m) continue; if(!checked[nx][ny] && iceberg[nx][ny]>0) { dfs(nx, ny); } } } public static void main(String[] args) { Scanner scan = new Scanner(System.in); n = scan.nextInt(); m = scan.nextInt(); int result = 0; iceberg = new int[n][m]; temp = new int[n][m]; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { iceberg[i][j] = scan.nextInt(); } } int tmp = 0; while((tmp = component_num()) < 2) { if(tmp==0) { result = 0; break; } ++result; checked = new boolean[301][301]; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(iceberg[i][j]>0) { temp[i][j]=melting_ice(i, j); } } } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { iceberg[i][j]-= temp[i][j]; } } } System.out.println(result); } } | cs |
반응형
'CS > Algorithm' 카테고리의 다른 글
[알고리즘][DFS][2251] 물통 (0) | 2018.09.27 |
---|---|
[알고리즘][문자열][1120] 문자열 (1) | 2018.05.04 |
[알고리즘][DFS][14502] 연구소 (0) | 2018.04.25 |
[알고리즘][DFS][1987] 알파벳 (0) | 2018.04.24 |
[알고리즘][DFS][2468] 안전영역 (JAVA) (0) | 2018.04.23 |
댓글