[JAVA] 7569 토마토

그린·2024년 3월 20일
0

PS

목록 보기
14/17

1) 문제

https://www.acmicpc.net/problem/7569

2) 접근 방법

아 지난번에 조금 더 쉬운 버전의 토마토 문제(https://www.acmicpc.net/problem/7576)를 풀었었는데 비슷하게 풀면 될 것 같은데... 일수를 계산하는 부분에서 막혀서.. 지난번에 썼던 글을 조금 참고해서 마저 풀었다.

지난번에 쓴 글 : https://velog.io/@godqhrals/JAVA-%EB%B0%B1%EC%A4%80-7576-%ED%86%A0%EB%A7%88%ED%86%A0

3중 for문에서 익은 토마토들을 발견할 때마다 큐에 넣고,
큐에서 하나씩 꺼내보면서
depth를 현재 depth + 1 로 진행해주면 된다!!

이걸 깜빡해서 결국 과거의 나에게 힌트를 얻었는데.. 덕분에 풀었다!!

하 기록의 중요성을 또 깨닫고 갑니다..

그리고 질문 게시판에 있는 웬만한 반례는 다 맞게 나왔는데
바로 틀렸습니다가 떠서...
https://www.acmicpc.net/board/view/115199
이 반례를 제시해주신 분.. 정말 감사합니다!!
덕분에 해결하고 맞았습니다!! 를 만났습니다...

3) 코드

import java.io.*;
import java.util.*;

public class Main {

    static int m, n, h;
    static int[][][] map;
    static int[][][] visited;
    static int[] dx = {-1, 1, 0, 0, 0, 0};
    static int[] dy = {0, 0, -1, 1, 0, 0};
    static int[] dz = {0, 0, 0, 0, -1, 1};
    static Queue<Node> q = new LinkedList<>();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        m = Integer.parseInt(st.nextToken());
        n = Integer.parseInt(st.nextToken());
        h = Integer.parseInt(st.nextToken());

        map = new int[h][n][m];
        visited = new int[h][n][m];
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < n; j++) {
                st = new StringTokenizer(br.readLine());
                for (int k = 0; k < m; k++) {
                    map[i][j][k] = Integer.parseInt(st.nextToken());
                }
            }
        }


        for (int i = 0; i < h; i++) {
            for (int j = 0; j < n; j++) {
                for (int k = 0; k < m; k++) {
                    if (map[i][j][k] == 1 && visited[i][j][k] == 0) {
                        q.offer(new Node(i, j, k));
                        visited[i][j][k] = 1; // +1으로 설정
                    }
                }
            }
        }
        bfs();

        int result = -1;
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < n; j++) {
                for (int k = 0; k < m; k++) {
                    if (map[i][j][k] == 0 && visited[i][j][k] == 0) {
                        System.out.println(-1);
                        return;
                    } else {
                        result = Math.max(result, visited[i][j][k]);
                    }
                }
            }
        }

        System.out.println(result - 1);
    }

    static void bfs() {
        while (!q.isEmpty()) {
            Node now = q.poll();

            for (int i = 0; i < 6; i++) {
                int nx = now.x + dx[i];
                int ny = now.y + dy[i];
                int nz = now.z + dz[i];
                if (nx < 0 || ny < 0 || nz < 0 || nx >= n || ny >= m || nz >= h) continue;
                if (map[nz][nx][ny] == 0 && visited[nz][nx][ny] == 0) {
                    q.offer(new Node(nz, nx, ny));
                    visited[nz][nx][ny] = visited[now.z][now.x][now.y] + 1;
                }
            }
        }
    }
}

class Node {
    int x;
    int y;
    int z;

    Node (int z, int x, int y) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
}
profile
기록하자

0개의 댓글

관련 채용 정보