[백준/BOJ] 7576 토마토 - JAVA

2025. 5. 25. 22:10·알고리즘/문제풀이

[백준/BOJ] 7576 토마토 - JAVA

문제 🍅

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

문제 분석

조건

  • `M*N` 크기의 상자에 각 칸에 토마토가 아래와 같이 저장되어있다.
  • 익은 토마토는 1, 안익은 토마토는 0, 토마토가 없음 -1
  • 익은 토마토는 하루가 지나면 인접한 4방향의 토마토를 익게 만드는데, 상자 속 모든 토마토가 익기까지 며칠이 걸리는지 구하는 문제
  • 모두 익지 못하는 상황에는 -1 출력

풀이방법

  • 익은 토마토를 전부 큐에 넣고 BFS탐색을 시작한다.
  • `visited`배열 대신 초기 입력받은 `box`를 이용하여 방문 처리를 한다.
  • 초기 입력받을 때 익지 않은 토마토 수를 카운트하고 방문처리와 동시에 익지 않은 토마토 수를 감소시키면 출력 전에 아직 안익은 토마토의 수를 알 수 있다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

class Tomato {
    private int r;
    private int c;
    private int count;

    public Tomato(int r, int c, int count) {
        this.r = r;
        this.c = c;
        this.count = count;
    }

    public int getR() {
        return r;
    }

    public int getC() {
        return c;
    }

    public int getCount() {
        return count;
    }
}

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        st = new StringTokenizer(br.readLine());
        int M = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());

        // 토마토 상태 및 방문 배열
        int[][] box = new int[N][M];
        // 익지 않은 토마토 수
        int remain = 0;

        Deque<Tomato> que = new ArrayDeque<>();
        for (int r = 0; r < N; r++) {
            st = new StringTokenizer(br.readLine());
            for (int c = 0; c < M; c++) {
                box[r][c] = Integer.parseInt(st.nextToken());
                if (box[r][c] == 1) {   // 익은 토마토는 바로 큐에 삽입
                    que.add(new Tomato(r, c, 0));
                } else if (box[r][c] == 0) { // 익지 않은 토마토 수를 카운트
                    remain++;
                }
            }
        }

        int[][] dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
        int answer = 0;
        // BFS 탐색
        while (!que.isEmpty()) {
            Tomato now = que.pop();
            answer = Math.max(answer, now.getCount());
            for (int[] dir : dirs) {
                int nextR = now.getR() + dir[0];
                int nextC = now.getC() + dir[1];
                if (nextR < 0 || nextR >= N || nextC < 0 || nextC >= M) {
                    continue;
                }
                if (box[nextR][nextC] == 0) {
                    box[nextR][nextC] = 1;
                    remain--; // 익지 않은 토마토 수 감소
                    que.add(new Tomato(nextR, nextC, now.getCount() + 1));
                }
            }
        }

        // 남은 토마토가 없을 때 정답 출력
        if (remain == 0) {
            System.out.println(answer);
        } else {
            System.out.println(-1);
        }
    }
}

시간복잡도

큐에 들어갈 수 있는 최대 개수는 박스의 크기와 동일하므로 시간복잡도는 O(N*M)

728x90
저작자표시 비영리 변경금지 (새창열림)
'알고리즘/문제풀이' 카테고리의 다른 글
  • [백준/BOJ] 11404 플로이드 - JAVA
  • [백준/BOJ] 16236 아기 상어 - JAVA
  • [프로그래머스] 43163 단어 변환 - JAVA
  • [백준/BOJ] 1967 트리의 지름 - JAVA
LIRI
LIRI
  • LIRI
    기록
    LIRI
  • 전체
    오늘
    어제
    • 분류 전체보기 (74)
      • 블로그 꾸미기 (0)
      • Spring (6)
      • 바이브코딩 (1)
      • React (3)
      • CS (0)
      • 알고리즘 (57)
        • 개념 (2)
        • 문제풀이 (54)
      • Java (1)
      • DB (1)
      • log (4)
        • SSAFY (3)
        • 궁금 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 공지사항

  • 인기 글

  • 태그

    SSAFY 9기
    lv3
    dfs
    백준
    LIS
    springboot
    dp
    알고리즘 문제풀이
    커서ai
    Java
    싸피
    최장증가부분수열
    pccp모의고사
    너비우선탐색
    ssafy 합격 후기
    바이브코딩
    리액트
    알고리즘
    Security
    SSAFY
    느좋코딩
    JWT
    BOJ
    Spring
    프로그래머스
    Springsecurity
    비트마스킹
    LV2
    BFS
    그리디
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
LIRI
[백준/BOJ] 7576 토마토 - JAVA
상단으로

티스토리툴바