계단을 오르듯이

[JAVA] 7569. 토마토 본문

알고리즘/백준_JAVA

[JAVA] 7569. 토마토

happyAyun 2022. 2. 3. 23:50

2차원과 같은 방식으로 접근하였고, 차이점은 방문처리도, 토마토를 넣는 배열도 3차원이고, 방향을 나타내는 배열의 방향이 2개 늘어 6개가 되었다는 점이다.

방향을 나타내는 dir 배열은 똑같은 2차원 배열에서 2차원의 수가 2에서 3으로 늘었다.

배열은 [높이][세로][가로] 로 하였다.

 

토마토에서 아직 덜 익은 0의 값의 수를 구하였고, 큐에 미리 익은 토마토를 넣어주었다. 큐에는 Node 클래스를 이용해 시간을 나타내는 time의 변수로 연산의 시간을 측정하였다.

익지 않은 토마토가 익게 되면 덜 익은 토마토의 수를 감소시켰고, 그 수가 0이 되면 연산이 종료되며 그 토마토가 익은 시간을 출력한다.

 

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
package algo;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class B_7569_토마토 {
 
    static int[][] dir = { { -100 }, { 100 }, { 00-1 }, { 001 }, { 010 }, { 0-10 } }; // 상 하 좌
 
    public static void main(String[] args) throws Exception {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(in.readLine(), " ");
        int M = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());
        int H = Integer.parseInt(st.nextToken());
        int[][][] arr = new int[H][N][M];
        boolean[][][] visited = new boolean[H][N][M];
        Queue<Node> q = new LinkedList<>();
        int count = 0;
        for (int i = 0; i < H; i++) {
            for (int j = 0; j < N; j++) {
                st = new StringTokenizer(in.readLine(), " ");
                for (int k = 0; k < M; k++) {
                    arr[i][j][k] = Integer.parseInt(st.nextToken());
                    if (arr[i][j][k] == 1) {
                        q.offer(new Node(i, j, k, 0));
                        visited[i][j][k] = true;
                    } else if (arr[i][j][k] == 0)
                        count++;
                }
            }
        }
        if (count == 0) {
            System.out.println(0);
            return;
        }
 
        int result = -1;
        while (!q.isEmpty()) {
            Node now = q.poll();
            int h = now.h;
            int y = now.y;
            int x = now.x;
            int time = now.time;
            for (int i = 0; i < 6; i++) {
                int mh = h + dir[i][0];
                int my = y + dir[i][1];
                int mx = x + dir[i][2];
                if (mh < 0 || my < 0 || mx < 0 || mh >= H || my >= N || mx >= M)
                    continue;
                if (visited[mh][my][mx] || arr[mh][my][mx] == -1)
                    continue;
                visited[mh][my][mx] = true;
                if (--count == 0) {
                    result = time + 1;
                    break;
                }
                arr[mh][my][mx] = 1;
                q.offer(new Node(mh, my, mx, time + 1));
            }
        }
        System.out.println(result);
    }
 
    static class Node {
        int h, y, x, time;
 
        public Node(int h, int y, int x, int time) {
            super();
            this.h = h;
            this.y = y;
            this.x = x;
            this.time = time;
        }
 
    }
}
 
cs

'알고리즘 > 백준_JAVA' 카테고리의 다른 글

[JAVA] 10773. 제로  (0) 2022.02.04
[JAVA] 1316. 그룹 단어 체커  (0) 2022.02.04
[JAVA] 6443. 애너그램  (0) 2022.02.02
[JAVA] 4386. 별자리 만들기  (0) 2022.02.02
[JAVA] 9663. N-Queen  (0) 2022.02.02