코딩 공부 연습

백준 2468 - 안전 영역

miffy짱 2022. 12. 8. 17:03
반응형
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) {
        int n;
        int table[][] = new int[102][102];
        //int visited[][] = new int[102][102];
        List<Integer> dir_x = List.of(0, 1, 0, -1);
        List<Integer> dir_y = List.of(1, 0, -1, 0);

        Scanner scanner = new Scanner(System.in);
        n = Integer.parseInt(scanner.nextLine());
        int max_height = 0;
        int min_height = 102;

        for (int i = 0; i < n; i++) {
            StringTokenizer stringTokenizer = new StringTokenizer(scanner.nextLine());
            for (int j = 0; j < n; j++) {
                table[i][j] = Integer.parseInt(stringTokenizer.nextToken());
                if (table[i][j] > max_height) {
                    max_height = table[i][j];
                }
                if (table[i][j] < min_height) {
                    min_height = table[i][j];
                }

            }
        }

        int max_val = 1;
        for (int height = min_height; height < max_height; height++) {

            int[][] visited = new int[102][102];
            int cnt = 0;
            Queue<Pair> q = new LinkedList<>();

            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (table[i][j] - height > 0 && visited[i][j] == 0) {
                        q.add(new Pair(i,j));
                        visited[i][j] = 1;
                        cnt++;

                        while (!q.isEmpty()) {
                            Pair cur = q.peek();
                            q.remove();
                            //cnt++;
                            for (int dir = 0; dir < 4; dir++) {
                                int c_x = cur.x + dir_x.get(dir);
                                int c_y = cur.y + dir_y.get(dir);
                                if (c_x < 0 || c_x >= n || c_y < 0 || c_y >= n) continue;
                                if (table[c_x][c_y] - height <= 0 || visited[c_x][c_y] == 1) continue;
                                visited[c_x][c_y] = 1;
                                q.add(new Pair(c_x, c_y));
                            }
                        }
                    }
                }
            }
            if (cnt > max_val) {
                max_val = cnt;
            }

        }
        System.out.println(max_val);
    }

    public static class Pair {
        int x, y;
        Pair(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }


}

이번엔 안전영역이란 bfs 를 풀어보았다. 이제 기계적으로 풀어재껴져야 하는데 아직도 고민을 하곤한다. 이제 다음 진도를 나가야 하는데...

이번에도 한번에 맞추지 못하고 틀렸다. 다행히 오류를 찾는 능력이 생겼나 바로 반례를 찾을 수 있었다.

처음에 최대 안전 영역의 개수를 0으로 시작하였는데, 비가 오지 않은 경우 bfs 를 안돌아 그 값이 바뀌지 않았다. 그래서 시작 을 1부터로 하였고 통과하였다.