반응형
BFS,,...
오랜만에 BFS 문제 풀려고 했었는데 생각이 않났다. 그래서 시간 두고 다시 풀어봄.
아주 단순히 이전 값에 +1 해주면 되는 거였다.
풀이
1. 토마토가 익은 점들을 큐에 넣어준다. (동시 다발적으로 일어나기 때문에 큐를 사용한 BFS)
2. 익은 토마토 상하좌우를 탐색하며 익지 않은 토마토가 있으면 그 위치를 큐에 넣어준다. (그 위치의 값은 최대 일수를 계산하기 위해 전 위치 +1 을 해준다.)
3. 큐가 빌때까지 계속해준다.
4. 전체 토마토들을 탐색하여 익지않은 토마토(0 값) 하나라도 있으면 -1를 출력한다.
5. 그 외는 최대 일수를 출력한다.
소스
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 97 98 | import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; public class Main { static int[] dx = { -1, 1, 0, 0 }; static int[] dy = { 0, 0, -1, 1 }; public static void main(String args[]) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt"))); // BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] str = br.readLine().split(" "); int M = Integer.parseInt(str[0]); int N = Integer.parseInt(str[1]); int[][] arr = new int[N][M]; for (int i = 0; i < N; i++) { str = br.readLine().split(" "); for (int j = 0; j < M; j++) { arr[i][j] = Integer.parseInt(str[j]); } } //----------------- 입력 부 ------------------ BFS(arr, N, M); } public static void BFS(int[][] arr, int N, int M) { Queue<DOT> q = new LinkedList<DOT>(); for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (arr[i][j] == 1) //익은 토마토가 있는 모든 위치를 큐에 담는다. q.add(new DOT(i, j)); } } while (!q.isEmpty()) { //익은 토마토의 상하좌우는 다음에 익기 때문에 큐에 담아야한다. DOT dot = q.poll(); for (int i = 0; i < 4; i++) { int nextX = dot.x + dx[i]; int nextY = dot.y + dy[i]; //범위 밖 패스 if (nextX < 0 || nextY < 0 || nextX >= N || nextY >= M) { continue; } //다음 위치가 익지 않은 토마토가 아니면 패스 if (arr[nextX][nextY] != 0) { continue; } //최대 일수를 구하기 때문에 1로 바꾸는 것이 아니라 현재 일수 +1 을 해줘야한다. arr[nextX][nextY] = arr[dot.x][dot.y] + 1; q.add(new DOT(nextX, nextY)); } //print(arr, N, M); // 농장 전체 출력 //System.out.println(); } int max = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (arr[i][j] == 0) { //토마토가 모두 익지 못한 상황이라면 -1 을 출력한다. System.out.println(-1); return; } max = Math.max(max, arr[i][j]); } } //그렇지 않다면 최대값을 출력한다. System.out.println(max - 1); } //농장을 전체 보여주는 함수 public static void print(int[][] arr, int N, int M) { for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); } } } class DOT { int x; int y; DOT(int x, int y) { this.x = x; this.y = y; } } | cs |
반응형
'나는요 공부가 좋....은걸... > 알고리즈음' 카테고리의 다른 글
[BOJ] 백준 2156 - 포도주 시식 (자바) (0) | 2018.02.20 |
---|---|
[BOJ] 백준 2910 - 빈도 정렬 (자바) (0) | 2018.02.20 |
[BOJ] 백준 14503 - 로봇청소기 (자바) (0) | 2018.02.20 |
[BOJ] 백준 5555 - 반지 (자바) (0) | 2018.02.15 |
[BOJ] 백준 11047 - 동전 0 (자바) (0) | 2018.02.13 |