Home 백준 - 토마토
Post
Cancel

백준 - 토마토

토마토 - 7576번

문제링크: 토마토

🤔접근 방법

익은 토마토와 익지 않은 토마토가 붙어있고 다음날이 된다면, 익지 않은 토마토는 익게 되는 것을 보고 점차 퍼지는 것이 머릿속에 그려졌다. 그래서 그래프 탐색과 연관 있다고 생각하게 됐다.

최소 일수를 구하라는 지문을 보고 BFS를 생각하게 됐다. BFS 특성상 같은 deps의 노드를 탐색하기 때문에 이를 deps = 날짜라고 생각했다.

기존 BFS는 첫 시작이 하나의 노드라면 여기서는 토마토가 1개 이상일 수도 있기 때문에 탐색 시 1개 이상의 노드를 넣어주어 BFS 알고리즘을 사용했다.

🤗풀이 방법

  1. 배열 입력 시 익은 토마토(숫자 1) 입력 시 total(전체 토마토)에서 빼주고 토마토가 빈 곳(숫자 -1)이라면 이 또한 total에서 빼주었다.
  2. 익은 토마토 입력 시 BFS탐색에 사용될 Queue에 넣어 주었다.
  3. 기존 BFS와 동일 하지만 days(날짜)를 counting하는것은 현재 Queue에 들어있는 노드가 다 없어져야 counting을 했다.
  4. 방문기준: 박스 범위인지, 이미 방문을 했는지를 기준으로 Queue에 추가할지 판단했다.
  5. Queue에 추가시 total에서 1씩 빼주었다.
  6. total이 0이 된다면 모두 익게 되어 days를 출력 그렇지 않다면 -1 출력
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import java.io.*;
import java.util.*;

public class Main {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;
	static int ROW, COLUMN, total;
	static int days = -1;
	static int[][] board;
	static boolean[][] isVisited;
	static int[] dr = {0,0,1,-1};
	static int[] dc = {1,-1,0,0};
	// Queue에서 좌표로 사용하기 위한 class
	private static class Pos {
	   int r, c;

	   Pos(int r, int c) {
	      this.r = r;
	      this.c = c;
	   }
	}

	public static void main(String[] args) throws IOException {
		// 입력
		st = new StringTokenizer(br.readLine());
		COLUMN = Integer.parseInt(st.nextToken());
		ROW = Integer.parseInt(st.nextToken());
		board = new int[ROW][COLUMN];
		isVisited = new boolean[ROW][COLUMN];
		total = ROW * COLUMN;
		Queue<Pos> queue = new LinkedList<>();

		for(int r=0; r < ROW ; r++) {
			st = new StringTokenizer(br.readLine());
			for(int c=0; c < COLUMN; c++) {
				int tomato = Integer.parseInt(st.nextToken());
				switch (tomato) {
					case 1: {
						queue.add(new Pos(r,c));
						total -= tomato;
						break;
					}
					case -1: {
						total += tomato;
						break;
					}
					default: {
						total += tomato;
					}
				}
				board[r][c] = tomato;
			}
		}
		//BFS
		while(queue.size() > 0) {
			int nowCount = queue.size();
			days++;

			while(nowCount-- > 0) {
				Pos now = queue.poll();

				for(int i=0; i<4; i++) {
					int nextR = now.r + dr[i];
					int nextC = now.c + dc[i];
					boolean isRange = nextR < 0 || nextR >=ROW || nextC < 0 || nextC >= COLUMN;

					if(isRange || isVisited[nextR][nextC]) continue;

					isVisited[nextR][nextC] = true;

					if(board[nextR][nextC] == 0) {
						queue.add(new Pos(nextR, nextC));
						isVisited[nextR][nextC] = true;
						total--;
					}
				}
			}
		}

		if(total > 0) {
			System.out.println(-1);
		} else {
			System.out.println(days);
		}
	}
}
-- Missing configuration options! --

백준 - Z

-