Skip to content

Commit 75f2251

Browse files
committed
[Gold III] Title: 치즈, Time: 268 ms, Memory: 43396 KB -BaekjoonHub
1 parent 345be8b commit 75f2251

File tree

2 files changed

+147
-0
lines changed

2 files changed

+147
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# [Gold III] 치즈 - 2638
2+
3+
[문제 링크](https://www.acmicpc.net/problem/2638)
4+
5+
### 성능 요약
6+
7+
메모리: 43396 KB, 시간: 268 ms
8+
9+
### 분류
10+
11+
구현, 그래프 이론, 그래프 탐색, 시뮬레이션, 너비 우선 탐색, 깊이 우선 탐색, 격자 그래프
12+
13+
### 제출 일자
14+
15+
2025년 11월 13일 17:17:07
16+
17+
### 문제 설명
18+
19+
<p>N×M의 모눈종이 위에 아주 얇은 치즈가 <그림 1>과 같이 표시되어 있다. 단, N 은 세로 격자의 수이고, M 은 가로 격자의 수이다. 이 치즈는 냉동 보관을 해야만 하는데 실내온도에 내어놓으면 공기와 접촉하여 천천히 녹는다. 그런데 이러한 모눈종이 모양의 치즈에서 각 치즈 격자(작 은 정사각형 모양)의 4변 중에서 적어도 2변 이상이 실내온도의 공기와 접촉한 것은 정확히 한시간만에 녹아 없어져 버린다. 따라서 아래 <그림 1> 모양과 같은 치즈(회색으로 표시된 부분)라면 C로 표시된 모든 치즈 격자는 한 시간 후에 사라진다.</p>
20+
21+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/a4998beb-104c-4e37-b3d7-fd91cd81464a/-/preview/" style="width: 208px; height: 171px;"></p>
22+
23+
<p style="text-align: center;"><그림 1></p>
24+
25+
<p><그림 2>와 같이 치즈 내부에 있는 공간은 치즈 외부 공기와 접촉하지 않는 것으로 가정한다. 그러므 로 이 공간에 접촉한 치즈 격자는 녹지 않고 C로 표시된 치즈 격자만 사라진다. 그러나 한 시간 후, 이 공간으로 외부공기가 유입되면 <그림 3>에서와 같이 C로 표시된 치즈 격자들이 사라지게 된다.</p>
26+
27+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/e5d519ee-53ea-40a6-b970-710cca0db128/-/preview/" style="width: 208px; height: 171px;"></p>
28+
29+
<p style="text-align: center;"><그림 2></p>
30+
31+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/a00b876a-86dc-4a82-a030-603a9b1593cc/-/preview/" style="width: 208px; height: 171px;"></p>
32+
33+
<p style="text-align: center;"><그림 3></p>
34+
35+
<p>모눈종이의 맨 가장자리에는 치즈가 놓이지 않는 것으로 가정한다. 입력으로 주어진 치즈가 모두 녹아 없어지는데 걸리는 정확한 시간을 구하는 프로그램을 작성하시오.</p>
36+
37+
### 입력
38+
39+
<p>첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로 표시된다. 또한, 각 0과 1은 하나의 공백으로 분리되어 있다.</p>
40+
41+
### 출력
42+
43+
<p>출력으로는 주어진 치즈가 모두 녹아 없어지는데 걸리는 정확한 시간을 정수로 첫 줄에 출력한다.</p>
44+
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
6+
static int dx[] = {-1,1,0,0};
7+
static int dy[] = {0,0,-1,1};
8+
static int N,M;
9+
10+
public static void main(String[] args) throws Exception {
11+
12+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
13+
14+
StringTokenizer st = new StringTokenizer(br.readLine());
15+
16+
N = Integer.parseInt(st.nextToken());
17+
M = Integer.parseInt(st.nextToken());
18+
19+
int arr[][] =new int[N][M];
20+
int cheeseCount = 0;
21+
for(int i =0; i<N; i++) {
22+
st = new StringTokenizer(br.readLine());
23+
for(int j =0; j<M; j++) {
24+
arr[i][j] = Integer.parseInt(st.nextToken());
25+
if(arr[i][j] == 1) {
26+
cheeseCount+=1;
27+
}
28+
}
29+
}
30+
int answer =0;
31+
32+
while(cheeseCount > 0) {
33+
List<int[]> eliminatedCheese = new ArrayList<>();
34+
35+
boolean air[][] = new boolean[N][M];
36+
37+
checkAir(arr,air);
38+
39+
for(int i =0; i<N; i++) {
40+
for(int j =0; j<M;j++) {
41+
if(arr[i][j] != 1) continue;
42+
43+
int count = 0;
44+
for(int k =0; k<4; k++) {
45+
int nowx = i + dx[k];
46+
int nowy = j + dy[k];
47+
48+
if(nowx < 0 || nowx >= N || nowy <0 || nowy>=M) {
49+
continue;
50+
}
51+
if(air[nowx][nowy]) {
52+
count+=1;
53+
}
54+
}
55+
if(count >=2) {
56+
eliminatedCheese.add(new int[] {i,j});
57+
}
58+
}
59+
}
60+
cheeseCount-= eliminatedCheese.size();
61+
for(int i =0; i< eliminatedCheese.size(); i++) {
62+
int now[] = eliminatedCheese.get(i);
63+
64+
arr[now[0]][now[1]] = 0;
65+
}
66+
answer+=1;
67+
}
68+
69+
70+
System.out.println(answer);
71+
}
72+
73+
74+
public static boolean checkAir(int arr[][], boolean air[][]) {
75+
76+
Queue<int[]> queue = new LinkedList<>();
77+
boolean visited[][] = new boolean[N][M];
78+
79+
queue.add(new int[]{0,0});
80+
visited[0][0] = true;
81+
82+
while(!queue.isEmpty()) {
83+
int now[] = queue.poll();
84+
85+
for(int i = 0; i < 4; i++) {
86+
int nx = now[0] + dx[i];
87+
int ny = now[1] + dy[i];
88+
89+
if(nx < 0 || nx >= N || ny < 0 || ny >= M) {
90+
continue;
91+
}
92+
if(!visited[nx][ny] && arr[nx][ny] != 1 && !air[nx][ny]) {
93+
visited[nx][ny] = true;
94+
air[nx][ny] = true;
95+
queue.add(new int[] { nx,ny});
96+
}
97+
}
98+
}
99+
return false;
100+
}
101+
102+
}
103+
// -> 결국 외부 공기를 한 번에 체크해야함. -> 겉에 돌면서

0 commit comments

Comments
 (0)