백준 7569 토마토

전재우·2021년 3월 2일
0
post-custom-banner


백준 7569 토마토

구현 전 생각

dx,dy를 이용한 사방 탐색에 위아래를 또 추가적으로 탐색하는 코드를 구현하고 bfs 즉 큐를 이용해서 탐색할것이다. 그리고 현재 토마토의 상태에 +1을 하여서 토마토를 그래프의 깊이별로 분류하고 전체 배열중 가장 큰값에 -1을 해서 토마토가 다 익는데 걸리는 시간을 구할것 같습니다.

아쉬운점

1.문제를 제대로 읽을것!!

n,m을 거꾸로 입력받아서 배열을 벗어나는 값을 찾느라 많은 시간을 소비하였다.
위아래를 탐색하는데 dz={-1,0}으로 해서 위를 탐색 하지 않았다 코드를 짤때 조금더 꼼꼼히 짤것!

2.한번에 해결 하는것 보다 나누어서 해결하는것이 코드를 이해하기도 쉽고 코드가 꼬이는 경우가 적어진다.

DFS의 추가 조건이 붙는 경우에 원래 해결해야하는 일(여기서는 사방탐색)을 수행한뒤 추가 조건(위 아래 탐색)을 수행하게 코드를 구성하는것이 좋다.

코드

package com.study27;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
class position{
	int x,y,z;
	int cnt;

	public position(int x, int y, int z) {
		this.x = x;
		this.y = y;
		this.z = z;
	}
	
}
public class backjoon_7569_토마토 {
	static int N,M,H;
	static int[][][] map;
	static int[] dx= {0,0,-1,1};
	static int[] dy= {-1,1,0,0};
	static int[] dz= {-1,1};
	static Queue<position> que=new LinkedList<>();
	public static void bfs() {
		while(!que.isEmpty()) {
			int x = que.peek().x;
			int y = que.peek().y;
			int z = que.peek().z;
			que.poll();
			//사방탐색하는 부분 
			for (int i = 0; i < 4; i++) {
				int nx = x+dx[i];
				int ny = y+dy[i];
				int nz = z;
				if(nx<0||ny<0||nx>=N||ny>=M) continue;
				if(map[nz][nx][ny]==-1) continue;
				if(map[nz][nx][ny]>0) continue;
				
				map[nz][nx][ny]=map[z][x][y]+1;
				que.offer(new position(nx,ny,nz));
			}
			//위아래 탐색하는 부분
			for (int i = 0; i < 2; i++) {
				int nx = x;
				int ny = y;
				int nz = z+dz[i];
				if(nz<0||nz>=H) continue;
				if(map[nz][nx][ny]==-1) continue;
				if(map[nz][nx][ny]>0) continue;
				
				map[nz][nx][ny]=map[z][x][y]+1;
				que.offer(new position(nx,ny,nz));
			}
			
		}
	}
	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];
		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());
					if(map[i][j][k]==1) {
						que.offer(new position(j,k,i));
					}
				}
			}
		}
		bfs();
		int max =0;
		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) {
						System.out.println(-1);
						return;
					}
					if(map[i][j][k]>0&&map[i][j][k]>max) 
					{	
						max = map[i][j][k];
					}
				}
			}
		}
		if(max>0)
			max--;
		System.out.println(max);
		
		
	}

}
profile
코린이
post-custom-banner

0개의 댓글