티스토리 뷰

반응형


#. 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[] = { -1010 };
    static int dy[] = { 010-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
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday