Skip to content

Commit be1867e

Browse files
committed
[Gold IV] Title: 빙산, Time: 1080 ms, Memory: 299012 KB -BaekjoonHub
1 parent cb42602 commit be1867e

File tree

2 files changed

+290
-0
lines changed

2 files changed

+290
-0
lines changed
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
# [Gold IV] 빙산 - 2573
2+
3+
[문제 링크](https://www.acmicpc.net/problem/2573)
4+
5+
### 성능 요약
6+
7+
메모리: 299012 KB, 시간: 1080 ms
8+
9+
### 분류
10+
11+
구현, 그래프 이론, 그래프 탐색, 너비 우선 탐색, 깊이 우선 탐색
12+
13+
### 제출 일자
14+
15+
2025년 8월 2일 06:06:41
16+
17+
### 문제 설명
18+
19+
<p>지구 온난화로 인하여 북극의 빙산이 녹고 있다. 빙산을 그림 1과 같이 2차원 배열에 표시한다고 하자. 빙산의 각 부분별 높이 정보는 배열의 각 칸에 양의 정수로 저장된다. 빙산 이외의 바다에 해당되는 칸에는 0이 저장된다. 그림 1에서 빈칸은 모두 0으로 채워져 있다고 생각한다.</p>
20+
21+
<table class="table table-bordered td-center table-center-35 td-width-5">
22+
<tbody>
23+
<tr>
24+
<td> </td>
25+
<td> </td>
26+
<td> </td>
27+
<td> </td>
28+
<td> </td>
29+
<td> </td>
30+
<td> </td>
31+
</tr>
32+
<tr>
33+
<td> </td>
34+
<td>2</td>
35+
<td>4</td>
36+
<td>5</td>
37+
<td>3</td>
38+
<td> </td>
39+
<td> </td>
40+
</tr>
41+
<tr>
42+
<td> </td>
43+
<td>3</td>
44+
<td> </td>
45+
<td>2</td>
46+
<td>5</td>
47+
<td>2</td>
48+
<td> </td>
49+
</tr>
50+
<tr>
51+
<td> </td>
52+
<td>7</td>
53+
<td>6</td>
54+
<td>2</td>
55+
<td>4</td>
56+
<td> </td>
57+
<td> </td>
58+
</tr>
59+
<tr>
60+
<td> </td>
61+
<td> </td>
62+
<td> </td>
63+
<td> </td>
64+
<td> </td>
65+
<td> </td>
66+
<td> </td>
67+
</tr>
68+
</tbody>
69+
</table>
70+
71+
<p style="text-align: center;">그림 1. 행의 개수가 5이고 열의 개수가 7인 2차원 배열에 저장된 빙산의 높이 정보</p>
72+
73+
<p><span style="line-height:1.6em">빙산의 높이는 바닷물에 많이 접해있는 부분에서 더 빨리 줄어들기 때문에, 배열에서 빙산의 각 부분에 해당되는 칸에 있는 높이는 일년마다 그 칸에 동서남북 네 방향으로 붙어있는 0이 저장된 칸의 개수만큼 줄어든다. 단, 각 칸에 저장된 높이는 0보다 더 줄어들지 않는다. 바닷물은 호수처럼 빙산에 둘러싸여 있을 수도 있다. 따라서 그림 1의 빙산은 일년후에 그림 2와 같이 변형된다.</span></p>
74+
75+
<p>그림 3은 그림 1의 빙산이 2년 후에 변한 모습을 보여준다. 2차원 배열에서 동서남북 방향으로 붙어있는 칸들은 서로 연결되어 있다고 말한다. 따라서 그림 2의 빙산은 한 덩어리이지만, 그림 3의 빙산은 세 덩어리로 분리되어 있다.</p>
76+
77+
<table class="table table-bordered td-center table-center-35 td-width-5">
78+
<tbody>
79+
<tr>
80+
<td> </td>
81+
<td> </td>
82+
<td> </td>
83+
<td> </td>
84+
<td> </td>
85+
<td> </td>
86+
<td> </td>
87+
</tr>
88+
<tr>
89+
<td> </td>
90+
<td> </td>
91+
<td>2</td>
92+
<td>4</td>
93+
<td>1</td>
94+
<td> </td>
95+
<td> </td>
96+
</tr>
97+
<tr>
98+
<td> </td>
99+
<td>1</td>
100+
<td> </td>
101+
<td>1</td>
102+
<td>5</td>
103+
<td> </td>
104+
<td> </td>
105+
</tr>
106+
<tr>
107+
<td> </td>
108+
<td>5</td>
109+
<td>4</td>
110+
<td>1</td>
111+
<td>2</td>
112+
<td> </td>
113+
<td> </td>
114+
</tr>
115+
<tr>
116+
<td> </td>
117+
<td> </td>
118+
<td> </td>
119+
<td> </td>
120+
<td> </td>
121+
<td> </td>
122+
<td> </td>
123+
</tr>
124+
</tbody>
125+
</table>
126+
127+
<p style="text-align: center;">그림 2</p>
128+
129+
<table class="table table-bordered td-center table-center-35 td-width-5">
130+
<tbody>
131+
<tr>
132+
<td> </td>
133+
<td> </td>
134+
<td> </td>
135+
<td> </td>
136+
<td> </td>
137+
<td> </td>
138+
<td> </td>
139+
</tr>
140+
<tr>
141+
<td> </td>
142+
<td> </td>
143+
<td> </td>
144+
<td>3</td>
145+
<td> </td>
146+
<td> </td>
147+
<td> </td>
148+
</tr>
149+
<tr>
150+
<td> </td>
151+
<td> </td>
152+
<td> </td>
153+
<td> </td>
154+
<td>4</td>
155+
<td> </td>
156+
<td> </td>
157+
</tr>
158+
<tr>
159+
<td> </td>
160+
<td>3</td>
161+
<td>2</td>
162+
<td> </td>
163+
<td> </td>
164+
<td> </td>
165+
<td> </td>
166+
</tr>
167+
<tr>
168+
<td> </td>
169+
<td> </td>
170+
<td> </td>
171+
<td> </td>
172+
<td> </td>
173+
<td> </td>
174+
<td> </td>
175+
</tr>
176+
</tbody>
177+
</table>
178+
179+
<p style="text-align: center;">그림 3</p>
180+
181+
<p>한 덩어리의 빙산이 주어질 때, 이 빙산이 두 덩어리 이상으로 분리되는 최초의 시간(년)을 구하는 프로그램을 작성하시오. 그림 1의 빙산에 대해서는 2가 답이다. 만일 전부 다 녹을 때까지 두 덩어리 이상으로 분리되지 않으면 프로그램은 0을 출력한다.</p>
182+
183+
### 입력
184+
185+
<p>첫 줄에는 이차원 배열의 행의 개수와 열의 개수를 나타내는 두 정수 N과 M이 한 개의 빈칸을 사이에 두고 주어진다. N과 M은 3 이상 300 이하이다. 그 다음 N개의 줄에는 각 줄마다 배열의 각 행을 나타내는 M개의 정수가 한 개의 빈 칸을 사이에 두고 주어진다. 각 칸에 들어가는 값은 0 이상 10 이하이다. 배열에서 빙산이 차지하는 칸의 개수, 즉, 1 이상의 정수가 들어가는 칸의 개수는 10,000 개 이하이다. 배열의 첫 번째 행과 열, 마지막 행과 열에는 항상 0으로 채워진다.</p>
186+
187+
### 출력
188+
189+
<p>첫 줄에 빙산이 분리되는 최초의 시간(년)을 출력한다. 만일 빙산이 다 녹을 때까지 분리되지 않으면 0을 출력한다.</p>
190+
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
class Main {
5+
static int[][] map = new int[301][301];
6+
static boolean visit[][];
7+
static int[] dx = {1, -1, 0, 0};
8+
static int[] dy = {0, 0, 1, -1};
9+
static int row;
10+
static int col;
11+
12+
public static void main (String[] args) throws Exception {
13+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
14+
int[] rcInput = Arrays.stream(br.readLine().split(" "))
15+
.mapToInt(Integer::parseInt)
16+
.toArray();
17+
row = rcInput[0];
18+
col = rcInput[1];
19+
20+
// 초기값 셋팅
21+
for(int i=0; i<row; i++){
22+
int[] colInput = Arrays.stream(br.readLine().split(" "))
23+
.mapToInt(Integer::parseInt)
24+
.toArray();
25+
for (int j=0; j<col; j++){
26+
map[i][j] = colInput[j];
27+
}
28+
}
29+
30+
int answer = 0;
31+
while(true){
32+
// 섬 개수 체크
33+
visit = new boolean[301][301];
34+
int count = 0;
35+
for(int i=0; i<row; i++){
36+
for(int j=0; j<col; j++){
37+
if(map[i][j] != 0 && !visit[i][j]){
38+
bfs(new int[]{i, j});
39+
count++;
40+
}
41+
}
42+
}
43+
if(count > 1){
44+
break;
45+
}
46+
//다 녹아버림
47+
if(count == 0){
48+
answer = 0;
49+
break;
50+
}
51+
answer++;
52+
// 숫자 줄이기 (녹임)
53+
int[][] melt = new int[301][301];
54+
for(int i=0; i<row; i++){
55+
for(int j=0; j<col; j++){
56+
for(int d=0; d<4; d++){
57+
int nextRow = i + dx[d];
58+
int nextCol = j + dy[d];
59+
if(0<=nextRow&&nextRow<row&&0<=nextCol&&nextCol<col){
60+
int nextNum = map[nextRow][nextCol];
61+
if(nextNum == 0){
62+
melt[i][j]++;
63+
}
64+
}
65+
}
66+
}
67+
}
68+
for(int i=0; i<row; i++) {
69+
for (int j = 0; j < col; j++) {
70+
map[i][j] = Math.max(0, map[i][j] - melt[i][j]);
71+
}
72+
}
73+
74+
}
75+
System.out.println(answer);
76+
77+
}
78+
79+
static void bfs(int[] start){
80+
int sRow = start[0];
81+
int sCol = start[1];
82+
Queue<int[]> q = new LinkedList<>();
83+
visit[sRow][sCol] = true;
84+
q.add(start);
85+
while(!q.isEmpty()){
86+
int[] cur = q.poll();
87+
88+
for(int d=0; d<4; d++){
89+
int nRow = cur[0] + dx[d];
90+
int nCol = cur[1] + dy[d];
91+
if(0<=nRow&&nRow<row&&0<=nCol&&nCol<col){
92+
if(map[nRow][nCol] != 0 && !visit[nRow][nCol]){
93+
q.add(new int[]{nRow, nCol});
94+
}
95+
visit[nRow][nCol] = true;
96+
}
97+
}
98+
}
99+
}
100+
}

0 commit comments

Comments
 (0)