백준/Java

[백준 1245] 농장 관리 - JAVA

SH3542 2024. 7. 22. 13:54

BOJ Link

 

유의할 점

명시되지 않은 조건이 있다.

=> 산봉우리의 높이는 0이 될 수 없다.

 

모호한 조건이 있다.

=> 산봉우리는 같은 높이를 가지는 하나의 격자 혹은 인접한 격자들의 집합으로 이루어져 있다.

 

이에 따라, 고려할 케이스

// input
3 3
0 0 0
0 0 0
1 0 1

// output
2 // ans
1 // wrong ans

 

풀이 이후, assert로 N=1 / M=1인 케이스는 없음을 확인했다.

제출 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Queue;
import java.util.StringTokenizer;

class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int R = Integer.parseInt(st.nextToken());
        int C = Integer.parseInt(st.nextToken());

        int[][] map = new int[R][C];
        boolean[][] visited = new boolean[R][C];

        int ans = 0;

        int[] dr = {0, 0, -1, 1, -1, -1, 1, 1};
        int[] dc = {-1, 1, 0, 0, -1, 1, -1, 1};

        for (int i = 0; i < R; i++) {
            map[i] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        }

        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {

                if (!visited[i][j]) {
                    boolean flag = true;
                    Queue<int[]> q = new ArrayDeque<>();
                    boolean[][] compared = new boolean[R][C];

                    visited[i][j] = true;
                    compared[i][j] = true;
                    int peak = map[i][j];

                    if (peak != 0) {
                        q.offer(new int[]{i, j});

                        while (!q.isEmpty()) {

                            int[] info = q.poll();

                            for (int k = 0; k < 8; k++) {
                                int tr = info[0] + dr[k];
                                int tc = info[1] + dc[k];
                                if (tr >= 0 && tr < R && tc >= 0 && tc < C && !compared[tr][tc]) {

                                    int tv = map[tr][tc];
                                    if (tv == peak) {
                                        visited[tr][tc] = true;
                                        compared[tr][tc] = true;
                                        q.offer(new int[]{tr, tc});
                                    } else if (tv > peak) {
                                        flag = false;
                                    }
                                }
                            }

                        }
                        if (flag) ans++;
                    }
                }
            }
        }

        System.out.println(ans);
    }
}

'백준 > Java' 카테고리의 다른 글

[백준 1091] 카드 섞기 - JAVA  (0) 2024.09.04
[백준 1239] 차트 - JAVA  (0) 2024.07.27
[백준 1202] 보석 도둑 - JAVA  (0) 2024.07.20
[백준 1011] Fly me to the Alpha Centauri - JAVA  (0) 2024.07.19
[백준 1195] 킥다운 - JAVA  (0) 2024.07.18