포스트

안전 영역

안전 영역

문제 파악


문제

🔖 백준(실버1) - 안전 영역


주요 조건

장마철에 물에 잠기지 않는 안전한 영역의 최대 개수

아무 지역도 물에 잠기지 않을 수도 있다.


TEST CASE

Test Case
5
6 8 2 6 2
3 2 3 4 6
6 7 3 3 2
7 2 5 3 6
8 9 5 2 7


문제 해결 과정


핵심 로직

• visited 배열을 초기화해준다.

• graph의 원본을 유지한다.

• 잠기는 경우와 잠기지 않은 경우를 각각 0과 1로 치환


해결 순서

⒈ 주어진 빌딩의 최소 높이와 최대 높이를 확인한다.

⒉ 높이를 범위로 하는 반복문을 만든다.

⒊ 높이 보다 작은 빌딩은 0으로, 높은 빌딩은 1로 치환한다.

⒋ DFS로직을 수행하면서 물에 차지 않은 지역의 수를 카운팅한다.


소스 코드


🔖 소스 코드

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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;

public class 안전지역 {

    static int N;
    static int[][] graph;
    static int[][] graphCopy;
    static boolean[][] visited;
    static Set<Integer> reformedArray;
    static List<Integer> temp = new ArrayList<>();
    static int[] dx = {1, -1, 0, 0};
    static int[] dy = {0, 0, -1, 1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        N = Integer.parseInt(st.nextToken());

        graph = new int[N][N];
        graphCopy = new int[N][N];

        for (int i = 0; i < N; i++) {
            String[] str = br.readLine().split(" ");
            for (int j = 0; j < N; j++) {
                graph[i][j] = Integer.parseInt(str[j]);
                graphCopy[i][j] = Integer.parseInt(str[j]);
            }
        }

        /**
         * ⒈ 주어진 빌딩의 최소 높이와 최대 높이를 확인한다.
         */
        flatGraphArray();
        int max = maxHeight();

        /**
         * ⒉ 높이를 범위로 하는 반복문을 만든다.
         */
        for (int i = 0; i <= max; i++) {

            visited = new boolean[N][N];
            /**
             * ⒊ 높이 보다 작은 빌딩은 0으로, 높은 빌딩은 1로 치환한다.
             */
            for (int j = 0; j < N; j++) {
                for (int k = 0; k < N; k++) {
                    if (graph[j][k] <= i) {
                        graphCopy[j][k] = 0;
                    }
                    else {
                        graphCopy[j][k] = 1;
                    }
                }
            }

            /**
             * ⒋ DFS 로직을 수행하면서 물에 차지 않은 지역의 수를 카운팅한다.
             */
            int count = 0;
            for (int j = 0; j < N; j++) {
                for (int k = 0; k < N; k++) {

                    if (!visited[j][k] && graphCopy[j][k] == 1) {
                        count++;
                        bfs(j,k);
                    }
                }
            }
            temp.add(count);
        }
        int answer = Collections.max(temp);
        System.out.println(answer);

    }

    private static Set<Integer> flatGraphArray() {
        reformedArray = Arrays.stream(graph).flatMapToInt(innerArray -> Arrays.stream(innerArray))
                .boxed()
                .collect(Collectors.toSet());
        return reformedArray;
    }

    private static int maxHeight() {
        return Collections.max(reformedArray);
    }

    private static void bfs(int row, int col) {

        Queue<int[]> queue = new LinkedList<>();
        queue.offer(new int[]{row, col});

        while (!queue.isEmpty()) {

            int[] poll = queue.poll();
            int curRow = poll[0];
            int curCol = poll[1];

            for (int i = 0; i < dx.length; i++) {
                int newRow = curRow + dx[i];
                int newCol = curCol + dy[i];

                if (isInRange(newRow, newCol)) {
                    visited[newRow][newCol] = true;
                    queue.offer(new int[]{newRow, newCol});
                }
            }
        }
    }
    private static boolean isInRange(int newRow, int newCol) {
        if (newRow >= 0 && newRow < N && newCol >= 0 && newCol < N
                && !visited[newRow][newCol] && graphCopy[newRow][newCol] == 1) {
            return true;
        }
        return false;
    }
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.