[백준] 7576 : 토마토 (JAVA)

·2021년 7월 18일
0

Algorithm

목록 보기
14/60

문제

BOJ 7576 : 토마토 - https://www.acmicpc.net/problem/7576

풀이

익은 토마토를 기준으로 주변 안익은 토마토들이 익어간다. 한 위치를 기준으로, 주변 위치들이 영향을 받기 때문에 우선 BFS로 풀이해야겠다고 생각했다.

입력받을 시 안익은 토마토의 개수를 세고, 익은 토마토 정보는 Queue에 넣어둔다.

다만 한 위치에서만 퍼지는 게 아니라, 익은 토마토가 여러 개라면 여러 개를 기준으로 각각의 위치에서 퍼지기 때문에 각각의 토마토가 자신이 언제 익었는지에 대한 정보를 갖고 있을 수 있도록 위치 class를 따로 정의해서 구현했다.

안익은 토마토가 익은 토마토에게 영향을 받게 되어 익게 되면, 입력 시 세어두었던 안익은 토마토의 개수(tomato_not)를 -1 해주었다(토마토가 전부 익었는지 확인하기 위해). 또한 최대 며칠이 걸렸는지만 확인하면 되기 때문에, day를 업데이트 해주었다.

더 이상 토마토를 익게할 수 없을 때(==queue가 비었을 때), 안익은 토마토가 없다면 day를 출력하고, 있다면 -1을 출력한다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class Main {

    static class Loc{
        int i;
        int j;
        int day;

        public Loc(int i, int j, int day) {
            this.i = i;
            this.j = j;
            this.day = day;
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] inputs = br.readLine().split(" ");

        int m = Integer.parseInt(inputs[0]);
        int n = Integer.parseInt(inputs[1]);

        int[][] map = new int[n][m];
        Queue<Loc> queue = new LinkedList<>();

        int tomato_not = 0;
        for (int i = 0; i < n; i++) {
            inputs = br.readLine().split(" ");
            for (int j = 0; j < m; j++) {
                map[i][j] = Integer.parseInt(inputs[j]);
                
                if(map[i][j]==0) tomato_not++; 	// 안익은 토마토 수 카운트

                if(map[i][j]==1){		// 익은 토마토는 큐에 넣기
                    queue.add(new Loc(i, j, 0));
                }
            }
        }

        int day = 0;

	// 움직일 4방향
        int[] mi = {0, 0, -1, 1};
        int[] mj = {1, -1, 0, 0};

        while (!queue.isEmpty()) {
            Loc now = queue.poll();

            for (int d = 0; d < 4; d++) {
                int ni = now.i + mi[d];
                int nj = now.j + mj[d];

                if(ni<0 || ni>=n || nj<0 || nj>=m) continue;
                
                if(map[ni][nj] == 0){ // 주변에 안익은 토마토가 있으면
                    map[ni][nj] = 1; 
                    tomato_not --;
                    queue.add(new Loc(ni, nj, now.day+1));
                    day = Math.max(day, now.day+1); // 날짜 업데이트
                }
            }
        }

        if(tomato_not==0){
            System.out.println(day);
        }else{
            System.out.println(-1);
        }
    }
}

정리

✔ 알고리즘 분류 - 그래프 이론, 그래프 탐색, 너비 우선 탐색
✔ 난이도 - ⚪ Silver 1

🤦‍♀️ 오늘의 메모

  • 뭔가 퍼져나간다! 하면 BFS를 생각할 것. 한 위치에서만 퍼지는 게 아니고 익은 토마토가 여러 개면 여러 개를 기준으로 퍼져나가기 때문에 날짜 카운트 처리를 어떻게 해야할 지 조금 고민했다(Queue를 2개 만들어야하나,,, day저장할 배열을 만들어야하나 고민,,,). 어쨌든 최대 며칠이 걸렸는지만 확인하면 되기 때문에 각각의 토마토가 '언제 익었는지'에만 집중하면 됐다!

참고 사이트

딱히 없음

profile
당근먹고 자라나는 개발자

0개의 댓글

관련 채용 정보