코테/백준

[백준/JAVA] 2638번: 치즈

imname1am 2024. 3. 12. 13:10
반응형

📖 문제

 

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[]{00});
        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

반응형