티스토리 뷰
반응형
#. Problem
* The copyright in this matter is in BOJ
#. Resolution Process
1. Read and understand problem
2. Redefine the problem + abstract
3. Create solution plan (select Algorithm, Data structure)
4. Prove the plan (check performance time and usage memory)
5. Carry out the plan
6. Look back on the plan and find a way to improve it
#. Solve
BFS 기본문제이다.
초기 익은 토마토의 위치를 기억하고 있다가 하나씩 확인하면서
주변에 안 익은 토마토가 있다면 익혀준다.
안 익은 토마토가 익었다면 해당 위치를 기억해주고
다시 하나씩 확인하는 단계를 반복해보자.
#. Code
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 | 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 BOJ7576_Class { static int dx[] = { -1, 0, 1, 0 }; static int dy[] = { 0, 1, 0, -1 }; static public class Pnt { int x; int y; public Pnt(int x, int y) { this.x = x; this.y = y; } } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; st = new StringTokenizer(br.readLine(), " "); int M = Integer.parseInt(st.nextToken()); int N = Integer.parseInt(st.nextToken()); int[][] map = new int[N][M]; int cntZero = 0; Queue<Pnt> q = new LinkedList<>(); for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine(), " "); for (int j = 0; j < M; j++) { map[i][j] = Integer.parseInt(st.nextToken()); // 익은 토마토의 위치를 Queue에 add if (map[i][j] == 1) q.add(new Pnt(i, j)); // 익지 않은 토마토 count if (map[i][j] == 0) cntZero++; } } // 모든 토마토가 익어있는 상태라면 if (cntZero == 0) { System.out.println("0"); return; } int res = -1; // 익은 토마토의 위치를 Queue에서 꺼내면서 주변 토마토를 익혀보자 while (!q.isEmpty()) { // 현재 Queue Size를 미리 저장 int tmpN = q.size(); res++; for (int day = 0; day < tmpN; day++) { Pnt tmpPnt = q.poll(); // 인접한 안 익은 토마토 찾기 for (int i = 0; i < 4; i++) { int xx = tmpPnt.x + dx[i]; int yy = tmpPnt.y + dy[i]; // 범위를 벗어날 경우 pass if (xx < 0 || yy < 0 || xx >= N || yy >= M) continue; // 인접한 토마토가 익지 않았다면 익혀주고 Queue에 넣기 if (map[xx][yy] == 0) { map[xx][yy] = 1; cntZero--; q.add(new Pnt(xx, yy)); } } } } // 아직 덜 익은 토마토가 있다면 if (cntZero != 0) System.out.println("-1"); else System.out.println(res); } } | cs |
반응형
'PS > Problem_Solving' 카테고리의 다른 글
[BOJ] 10026.적록색약.java (0) | 2020.08.07 |
---|---|
[BOJ] 1068.트리.java (0) | 2020.08.07 |
[BOJ] 2187. 미로 탐색(BFS).java (0) | 2020.08.06 |
[BOJ] 4963. 섬의개수(DFS, BFS).java (0) | 2020.08.06 |
[BOJ] 2667. 단지번호붙이기(BFS, DFS).java (0) | 2020.08.06 |
댓글