Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
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
Tags
more
Archives
Today
Total
관리 메뉴

main

[백준-7576번/Java] 토마토 본문

Algorithm

[백준-7576번/Java] 토마토

1984 2022. 11. 17. 15:27

* BFS ; queue 사용

import java.io.*;
import java.util.*;

public class Main {
	static int[][] arr; // 전체 상태 배열
	static Queue<Cann> agedTomato; // 숙성된 토마토 칸 배열
	static int M;
	static int N;
	static int day = 0;

	private static class Cann {
		int x;
		int y;

		public Cann(int x, int y) {
			this.x = x;
			this.y = y;
		}

		@Override
		public boolean equals(Object o) {
			if (o instanceof Cann) {
				return x == ((Cann) o).x && y == ((Cann) o).y;
			} else {
				return false;
			}
		}

		@Override
		public int hashCode() {
			return Objects.hash(x, y);
		}

		@Override
		public String toString() {
			// TODO Auto-generated method stub
			return "(" + x + ", " + y + ")";
		}

	}

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		StringTokenizer mn = new StringTokenizer(br.readLine(), " ");

		M = Integer.parseInt(mn.nextToken());
		N = Integer.parseInt(mn.nextToken());

		arr = new int[N][M];
		agedTomato = new LinkedList<Cann>();

		for (int i = 0; i < N; i++) {
			StringTokenizer stk = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < M; j++) {
				int value = Integer.parseInt(stk.nextToken());
				arr[i][j] = value;
				if (value == 1 || value == -1) {
					agedTomato.add(new Cann(i, j));
				}
			}
		}

		if (aging()) {
			System.out.println(day);
		} else {
			System.out.println(-1);
		}

	}

	private static boolean aging() {

		while (!agedTomato.isEmpty()) {
			Cann cann = agedTomato.poll();
			int i = cann.x;
			int j = cann.y;

			if (arr[i][j] >= 1) {
				if (i - 1 >= 0 && arr[i - 1][j] == 0) { // 상
					agedTomato.add(new Cann(i - 1, j));
					arr[i - 1][j] = arr[i][j] + 1;
				}
				if (i + 1 < N && arr[i + 1][j] == 0) { // 하
					agedTomato.add(new Cann(i + 1, j));
					arr[i + 1][j] = arr[i][j] + 1;
				}
				if (j - 1 >= 0 && arr[i][j - 1] == 0) { // 좌
					agedTomato.add(new Cann(i, j - 1));
					arr[i][j - 1] = arr[i][j] + 1;
				}
				if (j + 1 < M && arr[i][j + 1] == 0) { // 우
					agedTomato.add(new Cann(i, j + 1));
					arr[i][j + 1] = arr[i][j] + 1;
				}
				day = arr[i][j] - 1;
			}
		}

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if (arr[i][j] == 0) {
					return false;
				}
			}
		}
		return true;
	}
}

 

* HashSet 으로 풀면 시간초과 남..

* HashSet 중복 체크하는 법

import java.io.*;
import java.util.*;

public class Main {
	static int[][] arr; // 전체 상태 배열
	static HashSet<Cann> agedTomato; // 숙성된 토마토 칸 배열
	static int M;
	static int N;
	static int wholeCount = 0;

	private static class Cann {
		int x;
		int y;

		public Cann(int x, int y) {
			this.x = x;
			this.y = y;
		}

		@Override
		public boolean equals(Object o) {
			if (o instanceof Cann) {
				return x == ((Cann) o).x && y == ((Cann) o).y;
			} else {
				return false;
			}
		}

		@Override
		public int hashCode() {
			return Objects.hash(x, y);
		}

	}

	private static int aging() {
		HashSet<Cann> changedCann = new HashSet<Cann>(); // 상태가 바뀐 토마토 칸 배열

		for (Cann cann : agedTomato) {
			int i = cann.x;
			int j = cann.y;

			if (arr[i][j] == 1) {
				if (i - 1 >= 0 && arr[i - 1][j] == 0) { // 상
					changedCann.add(new Cann(i - 1, j));
				}
				if (i + 1 < N && arr[i + 1][j] == 0) { // 하
					changedCann.add(new Cann(i + 1, j));
				}
				if (j - 1 >= 0 && arr[i][j - 1] == 0) { // 좌
					changedCann.add(new Cann(i, j - 1));
				}
				if (j + 1 < M && arr[i][j + 1] == 0) { // 우
					changedCann.add(new Cann(i, j + 1));
				}
			}
		}

		// 바뀐 상태값 반영
		for (Cann cann : changedCann) {
			agedTomato.add(cann);
			arr[cann.x][cann.y] = 1;
		}

		return changedCann.size();
	}

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		StringTokenizer mn = new StringTokenizer(br.readLine(), " ");

		M = Integer.parseInt(mn.nextToken());
		N = Integer.parseInt(mn.nextToken());

		arr = new int[N][M];
		agedTomato = new HashSet<Cann>();

		for (int i = 0; i < N; i++) {
			StringTokenizer stk = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < M; j++) {
				int value = Integer.parseInt(stk.nextToken());
				arr[i][j] = value;
				if (value == 1 || value == -1) {
					agedTomato.add(new Cann(i, j));
				}
			}
		}

		// 모든 토마토가 익는 날짜
		int day = 0;
		while (true) {
			int count = aging();
			if (count == 0)
				break;
			else
				day++;
		}

		if (agedTomato.size() == N * M) {
			System.out.println(day);
		} else {
			System.out.println(-1);
		}

	}

}
728x90

'Algorithm' 카테고리의 다른 글

[백준-9012번/Java] 괄호  (0) 2022.11.17
[백준-11047번/Java] 동전 0  (0) 2022.11.17
[백준-11403번/Java] 경로찾기  (0) 2022.11.17
[백준-17219번/Java] 비밀번호 찾기  (0) 2022.11.16
[백준-1932번/Java] 정수 삼각형  (0) 2022.11.16
Comments