공부공간

BOJ - 7576 ) 토마토 본문

알고리즘/완전탐색(BFS,DFS)

BOJ - 7576 ) 토마토

개발자가될수있을까? 2020. 2. 17. 08:58

 

 


https://www.acmicpc.net/problem/7576

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토들의 정보가 주어진다. 즉, 둘째 줄부터 N개의 줄에는 상자에 담긴 토마토의 정보가 주어진다. 하나의 줄에는 상자 가로줄에 들어있는 토마토의 상태가 M개의 정수로 주어진다. 정수 1은 익은 토마토, 정수 0은 익지 않은 토마토, 정수 -1은 토마

www.acmicpc.net

 


익은토마토가 주변에 안익은 토마토를 전파하면서 퍼지는 문제이다.

 

퍼질때에 값이 일정하게 ( 시간이 + 1 ) 씩 증가하므로 

 

BFS로 퍼지는 최대시간을 구해준다.

 





import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String[] args) throws Exception{
		int dir[][] = {{1,0},{-1,0},{0,1},{0,-1}};
		int answer =0;
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int m = Integer.parseInt(st.nextToken());
		int n = Integer.parseInt(st.nextToken());
		int map[][] = new int[n][m];
		ArrayDeque<int []> dq = new ArrayDeque<>();
		//  0 번째는 y 좌표 1번째는 x 좌표 2번째는 날짜
		for (int y = 0 ; y<n ;y++) {
			st = new StringTokenizer(br.readLine());
			for(int x= 0 ; x < m ; x++) {
				map[y][x] = Integer.parseInt(st.nextToken());
				if(map[y][x]==1) dq.add(new int[] {y,x,0});		
				// 1이면 시작점이기 때문에 큐에 넣어준다.
			}
		}
		while(!dq.isEmpty()) {
			int now[] = dq.poll();
			int now_y =now[0]; int now_x = now[1]; int time = now[2];
			answer = time;
			for(int index = 0 ; index < 4 ; index++) {
				int next_y = now_y + dir[index][0];
				int next_x = now_x + dir[index][1];
				if(next_y >=0 && next_x >= 0 && next_y < n && next_x <m) {
					if(map[next_y][next_x]==0) {
						// 다음 장소가 익지않은 토마토라면, 1로 변경한후에 시간을 늘리고 큐에 넣어준다.
						map[next_y][next_x]=1;
						dq.add(new int[] {next_y , next_x , time+1});
					}
				}
			}
		}
		
		for(int y = 0 ; y < n ; y++) {
			for(int x = 0 ; x < m ; x++) {
				// BFS가 끝나고 익지않은 토마토가 있다면, -1을 출력한다.
				if(map[y][x]==0) answer = -1;
			}
		}
		System.out.println( answer );
	}
	
}

확실하게 C++ 이 메모리나 시간이나 좀 더 좋은것같다.

'알고리즘 > 완전탐색(BFS,DFS)' 카테고리의 다른 글

BOJ- 11404 ) 플로이드  (0) 2020.02.17
BOJ - 17471 ) 게리맨더링  (0) 2020.02.17
BOJ - 2146 ) 다리만들기  (0) 2020.02.13
BOJ - 17406 ) 배열돌리기4  (0) 2020.02.11
SWEA ) 벽돌깨기  (0) 2020.02.09
Comments