Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

최's 먹공로그

BOJ7569 토마토 본문

APS

BOJ7569 토마토

ChoiSH313 2022. 6. 6. 13:11

<Solution>

1. 익은 토마토들은 하루 지나면 인접 토마토를 익게함(인접 : 위,아래,오,왼,상,하)

2. 토마토가 다 익는데 걸리는 최소 일 수

3. 동시간대 퍼지는 토마토인지 어떤식으로 구분할 수 있을까?? 큐의 크기로 구분


<Source Code>

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

public class BOJ7569_토마토 {

	static int[][][] map;
	static int day = 0;
	static int[][][] visit;
	static int M;
	static int N;
	static int H;
	static int zero_cnt;


	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];
		visit = new int[H][N][M];
		zero_cnt = 0; // 종료조건으로 사용 가능
		for(int hi = 0; hi < H; hi++) {
			for(int ni = 0; ni < N; ni++) {
				st = new StringTokenizer(br.readLine(), " ");
				for(int mi = 0; mi < M; mi++) {
					int temp_n = Integer.parseInt(st.nextToken());
					map[hi][ni][mi] = temp_n;
					if(temp_n == 0)
						zero_cnt++;
					else if(temp_n == 1) // 익은 토마토들의 위치 저장
						q.add(new pair(hi,ni,mi));
				}
			}
		}
		// 익게할 토마토가 한개도 없으면 그냥 끝
		if(zero_cnt == 0) {
			System.out.print(0);
			return;
		}
		// 다 안익은 토마토 일때
		else if(zero_cnt == H * M * N) {
			System.out.print(-1);
			return;
		}
		bfs();
		if(zero_cnt > 0)
			System.out.print(-1);
		else
			System.out.print(day);
	}
	// 상,우,하,좌,위,아래
	static int[] dh = {0,0,0,0,-1,1};
	static int[] dn = {-1,0,1,0,0,0};
	static int[] dm = {0,1,0,-1,0,0};
	static Queue<pair> q = new LinkedList<pair>();
	public static void bfs() {
		while(!q.isEmpty()) {
			int q_size = q.size();
			day++;
			for(int qi = 0; qi < q_size; qi++) {
				pair p = q.poll();
				int ph = p.h;
				int pn = p.n;
				int pm = p.m;
				for(int hnmi = 0; hnmi < 6; hnmi++) {
					int hh = ph + dh[hnmi];
					int nn = pn + dn[hnmi];
					int mm = pm + dm[hnmi];
					if(hh < 0 || hh >= H || nn < 0 || nn >= N || mm < 0 || mm >= M)
						continue;
					if(map[hh][nn][mm] != 0)
						continue;
					q.add(new pair(hh, nn, mm));
					map[hh][nn][mm] = 1;
					zero_cnt--; // 안익은 토마토를 익은 상태로 만드니깐 0의 개수를 줄여줌
					if(zero_cnt == 0) // 다 익었으면 더 이상 볼필요 없으니 return
						return;
				}
			}
		}
	}

	static class pair{
		int h;
		int n;
		int m;
		public pair(int h, int n, int m) {
			super();
			this.h = h;
			this.n = n;
			this.m = m;
		}
	}
}

처음에는 3중 for 문 돌면서 익은 토마토가 있을 때 마다 bfs를 돌렸는데 이러면 안되고 처음에 익은 토마토의 위치를 일괄 저장해주고 bfs 한번 타고 들어가는 식으로 해야함

'APS' 카테고리의 다른 글

BOJ5014 스타트링크  (0) 2022.06.13
BOJ1697 숨바꼭질  (0) 2022.06.12
BOJ2644 촌수계산  (0) 2022.06.05
BOJ2667 단지번호붙이기  (0) 2022.06.05
BOJ2606 바이러스  (0) 2022.06.03