말하는 컴공감자의 텃밭

백준 7579번 토마토 G5 - BFS 본문

알고리즘/Backjoon - Java

백준 7579번 토마토 G5 - BFS

현콩 2023. 11. 18. 12:00
728x90

백준 7579번 토마토 G5 - BFS
이젠 쉽다 요놈

 

 

ㅎㅎ 토마토

 

이전 문제와 비슷하다. 사실 얘를 먼저풀었는데 블로그에 정리를 안했었네~

++

https://hb-in99.tistory.com/89

 

백준 7576번 토마토 G5 - BFS

요즘 지문 긴게 좋더라.. 뭔가 풀고 뿌듯한 느낌이 든다. 이해 잘못하면 큰일이긴 한데 ㅎㅎ 이 문제는 쉬운 BFS인데 시작점이 여러개라는 점과 날짜를 어떻게 기록하지? 가 관건인 문제였다. 익

hb-in99.tistory.com

 

이 친구도 동일하지만 이번엔 층이 생겼다.

기존에는 row와 col로만 찾았다면 이젠 위층도 생겨버렸다.

 

전에 해서 쉽쥬~ 실수만 하지 맙시다.

큐에 익은 토마토 모두 넣고 bfs 돌리기!!

이왕 함수로 뺀겸 범위 체크도 분리해서 가독성 올려주었다.

 

import java.util.*; public class Main { // 7569번 토마토 G5 41% // bfs로 해결. // 하루마다 1인접 0은 모두 +1 날짜는 익은 토마토에 +1 계속하기. // 인접해 있는지 체크 필요. public static int[] dx = { 0, 0, -1, 1, 0, 0 }; public static int[] dy = { 1, -1, 0, 0, 0, 0 }; public static int[] dz = { 0, 0, 0, 0, 1, -1 }; public static int H, N, M, answer; // z,x,y public static int[][][] tomato; public static Queue que = new LinkedList<>(); public static void main(String[] args) { Scanner sc = new Scanner(System.in); M = sc.nextInt(); N = sc.nextInt(); H = sc.nextInt(); tomato = new int[H][N][M]; // input -> 익은 토마토 1, 안익은 토마토 0. 공백 -1 for (int h = 0; h < H; h++) { for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { tomato[h][i][j] = sc.nextInt(); if (tomato[h][i][j] == 1) { que.add(new int[] { h, i, j }); } } } } bfs(); System.out.println(answer); } public static void bfs() { while (!que.isEmpty()) { int[] cur = que.poll(); int cur_Z = cur[0]; int cur_X = cur[1]; int cur_Y = cur[2]; for (int i = 0; i < 6; i++) { int next_Z = cur_Z + dz[i]; int next_X = cur_X + dx[i]; int next_Y = cur_Y + dy[i]; if (chk(next_Z, next_X, next_Y)) { que.add(new int[] { next_Z, next_X, next_Y }); tomato[next_Z][next_X][next_Y] = tomato[cur_Z][cur_X][cur_Y] + 1; } } } int result = Integer.MIN_VALUE; for (int i = 0; i < H; i++) { for (int j = 0; j < N; j++) { for (int k = 0; k < M; k++) { if (tomato[i][j][k] == 0) { answer = -1; return; } result = Math.max(result, tomato[i][j][k]); } } } if (result == 1) { answer = 0; return; } else { answer = result - 1; return; } } public static boolean chk(int z, int x, int y) { return z >= 0 && x >= 0 && y >= 0 && z < H && x < N && y < M && (tomato[z][x][y] == 0); } }

 

728x90
Comments