<Algorithm> 34. 7576번 토마토
by BFine반응형
1. 7576번 토마토
기본 BFS 문제, 영역이 하루에 한번씩만 늘어나기 때문에 BFS를 활용하여 level을 출력한다.
주의할 점은 DFS는 영역의 깊이를 탐색하기 때문에 BFS로 푸는 것이 더 쉽게 풀수 있다.
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 87 88 89 90 91 92 93 94 95 96 | 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 Main { static boolean[][] visited; static int[][] dist; static int max = 0; public static void main(String[] args) throws NumberFormatException, IOException { 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[][] arr = new int[N][M]; visited = new boolean[N][M]; dist = new int[N][M]; for(int i = 0; i < N; i ++) { st = new StringTokenizer(br.readLine()); for(int j = 0; j < M; j++) { arr[i][j] = Integer.parseInt(st.nextToken()); } } Queue<Coordinate> queue = new LinkedList<>(); for(int i = 0; i < N; i ++) { for(int j = 0; j < M; j++) { if(arr[i][j] == 1) { // 처음 시작할때 익은 토마토 탐색 queue.add(new Coordinate(i, j)); visited[i][j] = true; dist[i][j] = 0; } } } bfs(arr, queue, M, N); for(int i = 0; i < N; i ++) { for(int j = 0; j < M; j++) { if(arr[i][j] == 0) { System.out.println(-1); // 다 익지 못한 경우 return; } } } System.out.println(max); } public static void bfs(int[][] arr, Queue<Coordinate> queue, int M, int N) { int[] dx = {0, 0, 1, -1}; int[] dy = {1, -1, 0, 0}; while(!queue.isEmpty()) { Coordinate loc = queue.remove(); int x = loc.x; int y = loc.y; for(int i = 0; i < dx.length ; i ++) { int nx = x + dx[i]; int ny = y + dy[i]; if(nx >= 0 && ny >= 0 && nx < N && ny < M && !visited[nx][ny] && arr[nx][ny] == 0) { // 상하좌우 방문 안했을 경우 && 안익은 토마토 일경우 queue.add(new Coordinate(nx, ny)); visited[nx][ny] = true; dist[nx][ny] = dist[x][y] + 1; // 걸린 일수 arr[nx][ny] = 1; // 익은 토마토 표시 if(max < dist[nx][ny]) { max = dist[nx][ny]; // 가장 오래걸린 일수가 모두 익은 일수 } } } } } } class Coordinate{ int x; int y; public Coordinate(int x, int y) { this.x = x; this.y = y; } } | cs |
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 36. 7569번 토마토 (0) | 2018.08.08 |
---|---|
<Algorithm> 35. 2178번 미로 탐색 (0) | 2018.08.07 |
<Algorithm> 33. 1987번 알파벳 (0) | 2018.08.05 |
<Algorithm> 32. 1652번 누울 자리를 찾아라 (0) | 2018.08.04 |
<Algorithm> 31. 1946번 신입사원 (0) | 2018.08.04 |
블로그의 정보
57개월 BackEnd
BFine