[백준/JAVA] 2638번: 치즈
📖 문제
2638번: 치즈
첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로
www.acmicpc.net
💡 풀이 방식
• 구현, 시뮬레이션, BFS
필요 자료구조
- 4방향 탐색용 배열
- 외부 공기와 접촉한 수 저장용 2차원 int형 배열 air (-1: 외부 공기)
- 치즈 수
1. 가장자리는 무조건 공기이므로 (0,0)부터 BFS를 수행해 가장자리(-1)를 표시한다.
2. 치즈(=값이 1)인 곳에서 상하좌우 中 외부 공기(=값이 -1) 갯수를 센다.
3. 외부 공기와 2개 이상 접하면 치즈를 녹인다.
4. 치즈 갯수가 0개가 될 때까지 1-3 과정을 반복한다.
🔺 코드
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
|
import java.util.*;
import java.io.*;
public class Main {
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,-1,1};
static int N,M;
static int[][] map, air;
static int cheeseCnt, time = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new int[N][M];
for(int i = 0 ; i < N ; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j = 0 ; j < M ; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
if(map[i][j] == 1)
cheeseCnt++;
}
}
while(cheeseCnt != 0)
melt();
System.out.println(time);
}
private static void melt() {
air = new int[N][M]; // 실내온도 공기와 접촉한 수 저장 배열
Queue<int[]> q = new ArrayDeque<>();
q.add(new int[]{0, 0});
air[0][0] = -1; // -1 : 외부 공기
while(!q.isEmpty()) { // 1. 바깥공기 영역 구하기
int[] now = q.poll();
for(int d = 0 ; d < 4 ; d++) {
int nx = now[0] + dx[d];
int ny = now[1] + dy[d];
if(!inRange(nx, ny)) continue;
if(map[nx][ny] == 1) // 치즈라면, 탐색하려는 곳의 air 배열 값+1
air[nx][ny]++;
if(map[nx][ny] == 0 && air[nx][ny] == 0) { // 바깥공기 처리
air[nx][ny] = -1;
q.add(new int[] {nx, ny});
}
}
}
// 2. 적어도 2번 이상 외부 공기와 접촉해야 녹이기
for(int i = 0 ; i < N ; i++) {
for(int j = 0 ; j < M ; j++) {
if(air[i][j] >= 2) {
cheeseCnt--;
map[i][j] = 0;
}
}
}
time++;
}
private static boolean inRange(int x, int y) {
return 0 <= x && x < N && 0 <= y && y < M;
}
}
|
cs |
➕ 다른 풀이 방식
- (DFS + BFS) int형 2차원 배열 1개, 방문 표시용 boolean형 2차원 배열 1개 사용하셨고,외부와 접촉한 공기는 2로 표시하셨다.
[백준 - Java] 2638번 : 치즈
문제 www.acmicpc.net/problem/2638 2638번: 치즈 첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5≤N, M≤100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로
minhamina.tistory.com
💦 어려웠던 점
- 치즈 내부에 있는 공간은 어떻게 판별하지? 의 문제
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
✔ 풀이 참고
백준 2638 - 치즈 Java
https://www.acmicpc.net/problem/2638 2638번: 치즈 첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은
dhelloper.tistory.com
백준 2638번 : 치즈 java
이 문제는 (0, 0)에서 bfs를 실행하여 위의 그림 1, 2, 3과 같이 바깥공기와 2면 이상이 닿은 치즈들을 녹이면서 몇 초 후에 치즈가 전부 없어지는지 구하는 문제입니다. 저는 각각의 치즈가 주변에
dy-coding.tistory.com
✔ 그림 설명 굿..
[백준] 2638번:치즈 (Java 자바)
문제 https://www.acmicpc.net/problem/2638 2638번: 치즈 첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부
jainn.tistory.com