IT recording...

[BOJ] 7569 토마토 - Java 본문

Algorithm

[BOJ] 7569 토마토 - Java

I-one 2022. 2. 17. 19:11

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

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

[원문링크]

https://adorable-aspen-d23.notion.site/BOJ-7569-6da8db8f25b64ecc86dde5dc4192d83e

 

[BOJ] 7569 토마토

코드

adorable-aspen-d23.notion.site

 

  • 풀이
    • 최소 시간을 관리하는 문제로 , 토마토가 퍼져 나가는 방식이다.
    • 토마토가 처음 있는 기본 상태에서 점점 퍼져나가며 맵이 변화하는 형식으로 너비 우선 탐색을 이용해 풀어야 한다.
import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Boj7569_토마토 {
    static int M,N,H;
    static StringTokenizer st;
    static int[][][] Map;
    static Queue<Point> queue = new LinkedList<>();
    static int[] drow = {0,0,-1,1,0,0}; //왼,오,위,아래,상,하
    static int[] dcol = {-1,1,0,0,0,0};
    static int[] dheight = {0,0,0,0,1,-1};
    static int doneTomato = 0;
    static int ssuck = 0;

    public static void main(String[] args) throws Exception{
        System.setIn(new FileInputStream("src/main/java/input.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        st = new StringTokenizer(br.readLine());
        M = Integer.parseInt(st.nextToken());
        N = Integer.parseInt(st.nextToken());
        H = Integer.parseInt(st.nextToken());
        Map = new int[N+1][M+1][H+1]; //세로row,가로col,높이

        for(int k=1;k<H+1;k++){
            for(int i=1;i<N+1;i++){//세로 row
                st = new StringTokenizer(br.readLine());
                for(int j=1;j<M+1;j++){ //가로 col
                    int tomato = Integer.parseInt(st.nextToken());
                    if(tomato == 1){ //익은 토마토 넣기
                        queue.add(new Point(i,j,k,0));
                    }
                    else if(tomato == -1){ //썩은 토마토 갯수
                        ssuck++;
                    }
                    Map[i][j][k] = tomato;
                }
            }
        }

        if(M*N*H == ssuck){ //모두 썩어있는 경우
            System.out.println(-1);
            return;
        }

        if(queue.size() == M*N*H - ssuck){ //이미 다 익어있는 경우
            System.out.println(0);
            return;
        }

        int answer = -1;
        boolean isEnd = false;
        while(!queue.isEmpty()){
            Point now = queue.poll();
            doneTomato ++;
            answer = Math.max(answer,now.day);

            if(doneTomato + ssuck >= N*M*H){ //목적지인가?
                isEnd = true;
                break;
            }

            for(int i=0;i<6;i++){
                //갈수있는가? -> 벽, 0인지
                int row = now.row + drow[i];
                int col = now.col + dcol[i];
                int height = now.height + dheight[i];
                if(1<=row && row<=N && 1<=col && col<=M && 1<= height && height <= H){
                    if(Map[row][col][height] == 0){
                        Map[row][col][height] = 1; //맵 변경
                        queue.add(new Point(row,col,height,now.day+1));
                    }
                }
            }
        }

        if(!isEnd){
            System.out.println(-1);
        }
        else {
            System.out.println(answer);
        }
    }

    static class Point{
        int row;
        int col;
        int height;
        int day;

        public Point(int row, int col, int height, int day) {
            this.row = row;
            this.col = col;
            this.height = height;
            this.day = day;
        }
    }
}

얻어가는 것

  • bfs 기본 사용

느낀점

"220217"

소요 시간 : 30min

'Algorithm' 카테고리의 다른 글

[PG] 전화번호목록 - Java  (0) 2022.03.28
[BOJ] 2573 빙산 - Java  (0) 2022.02.19
[BOJ] 2517 달리기 - Java  (0) 2022.02.04
[BOJ] 2014 소수의 곱 - Java  (0) 2022.02.04
[BOJ] 2904 수학은 너무 쉬워 - Java  (0) 2022.02.04
Comments