Per ardua ad astra !
I'm On My Way
Per ardua ad astra !
전체 방문자
오늘
어제
  • 분류 전체보기 (126)
    • Algorithm (50)
      • 백준 (30)
      • SWEA (3)
      • JUNGOL (3)
      • Programmers (5)
      • LeetCode (2)
    • 안드로이드 개발 (6)
      • Java로 개발 (0)
      • Kotlin으로 개발 (3)
    • Spring (41)
      • Spring기본 (17)
      • JPA기본 (15)
      • JPA활용 SpringBoot 기본 (9)
      • API 개발 기본 (0)
    • 네트워크 (3)
    • 운영체제 (0)
    • Life (3)
      • 책 (0)
      • 자기계발 (1)
      • 일상 (2)
    • 노마드코더 (3)
      • python으로 웹 스크래퍼 만들기 (3)
    • 프로그래밍 언어 (17)
      • Java 기본 (2)
      • 코틀린 기본 (15)

블로그 메뉴

  • 홈
  • 방명록

인기 글

hELLO · Designed By 정상우.
Per ardua ad astra !

I'm On My Way

Algorithm/백준

BaekJoon 7576. 토마토(Java)(BFS)(실버1)

2020. 9. 7. 14:43

문제출저 : www.acmicpc.net/problem/7576

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토�

www.acmicpc.net

풀이 과정

- pair객체는 필드를 3개 가진다. 좌표(row, col)와 date. 여기서 date는 bfs를 하면서 +1씩되는 날짜를 의미

- 익은 토마토를 미리 찾아놓고 Queue에 저장.

- 저장한 토마토를 하나씩 꺼내면서 BFS시작.

- BFS과정을 거치면 날짜가 1씩 커지면서 모든 토마토를 익게하고, 다익었다는 가정하에 가장 큰 maxDate가 정답.

 

소스코드

package 백준;

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

public class Ex_7576 {
	// 실버1 토마토 bfs 문제 https://www.acmicpc.net/problem/7576
	private static class Pair {
		int row;
		int col;
		int date;

		public Pair(int row, int col, int date) {
			this.row = row;
			this.col = col;
			this.date = date;
		}
	}

	private static int N;
	private static int M;
	private static int[][] map;
	private static int maxDate = 0;
	private static Queue<Pair> q = new LinkedList<Pair>();
	private static int[] dr = { -1, 1, 0, 0 };
	private static int[] dc = { 0, 0, -1, 1 };

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

		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		M = Integer.parseInt(st.nextToken());
		N = Integer.parseInt(st.nextToken());

		map = new int[N][M]; // 인덱스에 맞추기위해서
		for (int row = 0; row < N; row++) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int col = 0; col < M; col++) {
				map[row][col] = Integer.parseInt(st.nextToken());
				if (map[row][col] == 1) { // 1을 미리 찾아 놓는다.
					q.offer(new Pair(row, col, 0));
				}
			}
		}
		bfs(); // 이 메소드를 거치면 maxDate에 토마토를 다 익히는데 며칠이 걸리는지가 저장됨

		// 답 체크
		boolean check = true;
		outerloop: for (int row = 0; row < N; row++) {
			for (int col = 0; col < M; col++) {
				if (map[row][col] == 0) {
					check = false;
					break outerloop;
				}
			}
		}
		int answer = check ? maxDate : -1;

		bw.write(answer + "");
		bw.close();
		br.close();
	}

	private static void bfs() {
		while (!q.isEmpty()) {
			Pair temp = q.poll();
			maxDate = Math.max(maxDate, temp.date);
			for (int i = 0; i < 4; i++) {
				int tr = temp.row + dr[i];
				int tc = temp.col + dc[i];
				if (tr >= 0 && tc >= 0 && tr < N && tc < M && map[tr][tc] == 0) {
					map[tr][tc] = 1;
					q.offer(new Pair(tr, tc, temp.date + 1));
				}
			}
		}

	}
}
    'Algorithm/백준' 카테고리의 다른 글
    • BaekJoon 9470. Strahler (Java) (골드3) (위상정렬, bfs, 인접리스트)
    • BaekJoon 18405. 경쟁적 전염(Java)(BFS)(실버1)
    • BaekJoon 1937. 욕심쟁이 판다(Java)(DFS,DP)(골드3)
    • BaekJoon 9466. 텀 프로젝트 (Java)(DFS)(골드4)
    Per ardua ad astra !
    Per ardua ad astra !
    개발자 지망생이며 열심히 공부하고 기억하기 위한 블로그입니다.

    티스토리툴바