๋ฌธ์ œ ์„ค๋ช…


๐Ÿ’ก Info

๋‚ด์šฉ

Nร—Nํฌ๊ธฐ์˜ ๋•…์ด ์žˆ๊ณ , ๋•…์€ 1ร—1๊ฐœ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ๋•…์—๋Š” ๋‚˜๋ผ๊ฐ€ ํ•˜๋‚˜์”ฉ ์กด์žฌํ•˜๋ฉฐ, rํ–‰ c์—ด์— ์žˆ๋Š” ๋‚˜๋ผ์—๋Š” A[r][c]๋ช…์ด ์‚ด๊ณ  ์žˆ๋‹ค. ์ธ์ ‘ํ•œ ๋‚˜๋ผ ์‚ฌ์ด์—๋Š” ๊ตญ๊ฒฝ์„ ์ด ์กด์žฌํ•œ๋‹ค. ๋ชจ๋“  ๋‚˜๋ผ๋Š” 1ร—1 ํฌ๊ธฐ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ๊ตญ๊ฒฝ์„ ์€ ์ •์‚ฌ๊ฐํ˜• ํ˜•ํƒœ์ด๋‹ค.

์˜ค๋Š˜๋ถ€ํ„ฐ ์ธ๊ตฌ ์ด๋™์ด ์‹œ์ž‘๋˜๋Š” ๋‚ ์ด๋‹ค.

์ธ๊ตฌ ์ด๋™์€ ํ•˜๋ฃจ ๋™์•ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰๋˜๊ณ , ๋” ์ด์ƒ ์•„๋ž˜ ๋ฐฉ๋ฒ•์— ์˜ํ•ด ์ธ๊ตฌ ์ด๋™์ด ์—†์„ ๋•Œ๊นŒ์ง€ ์ง€์†๋œ๋‹ค.

  • ๊ตญ๊ฒฝ์„ ์„ ๊ณต์œ ํ•˜๋Š” ๋‘ ๋‚˜๋ผ์˜ ์ธ๊ตฌ ์ฐจ์ด๊ฐ€ L๋ช… ์ด์ƒ, R๋ช… ์ดํ•˜๋ผ๋ฉด, ๋‘ ๋‚˜๋ผ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๊ตญ๊ฒฝ์„ ์„ ์˜ค๋Š˜ ํ•˜๋ฃจ ๋™์•ˆ ์—ฐ๋‹ค.
  • ์œ„์˜ ์กฐ๊ฑด์— ์˜ํ•ด ์—ด์–ด์•ผํ•˜๋Š” ๊ตญ๊ฒฝ์„ ์ด ๋ชจ๋‘ ์—ด๋ ธ๋‹ค๋ฉด, ์ธ๊ตฌ ์ด๋™์„ ์‹œ์ž‘ํ•œ๋‹ค.
  • ๊ตญ๊ฒฝ์„ ์ด ์—ด๋ ค์žˆ์–ด ์ธ์ ‘ํ•œ ์นธ๋งŒ์„ ์ด์šฉํ•ด ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด, ๊ทธ ๋‚˜๋ผ๋ฅผ ์˜ค๋Š˜ ํ•˜๋ฃจ ๋™์•ˆ์€ ์—ฐํ•ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • ์—ฐํ•ฉ์„ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ๊ฐ ์นธ์˜ ์ธ๊ตฌ์ˆ˜๋Š” (์—ฐํ•ฉ์˜ ์ธ๊ตฌ์ˆ˜) / (์—ฐํ•ฉ์„ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ์นธ์˜ ๊ฐœ์ˆ˜)๊ฐ€ ๋œ๋‹ค. ํŽธ์˜์ƒ ์†Œ์ˆ˜์ ์€ ๋ฒ„๋ฆฐ๋‹ค.
  • ์—ฐํ•ฉ์„ ํ•ด์ฒดํ•˜๊ณ , ๋ชจ๋“  ๊ตญ๊ฒฝ์„ ์„ ๋‹ซ๋Š”๋‹ค.

๊ฐ ๋‚˜๋ผ์˜ ์ธ๊ตฌ์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ธ๊ตฌ ์ด๋™์ด ๋ฉฐ์น  ๋™์•ˆ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๐Ÿ“ฅ์ž…๋ ฅ ์กฐ๊ฑด

  • ์ฒซ์งธ ์ค„์— N, L, R์ด ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค N โ‰ค 50, 1 โ‰ค L โ‰ค R โ‰ค 100)
  • ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฐ ๋‚˜๋ผ์˜ ์ธ๊ตฌ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. rํ–‰ c์—ด์— ์ฃผ์–ด์ง€๋Š” ์ •์ˆ˜๋Š” A[r][c]์˜ ๊ฐ’์ด๋‹ค. (0 โ‰ค A[r][c] โ‰ค 100)
  • ์ธ๊ตฌ ์ด๋™์ด ๋ฐœ์ƒํ•˜๋Š” ์ผ์ˆ˜๊ฐ€ 2,000๋ฒˆ ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž…๋ ฅ๋งŒ ์ฃผ์–ด์ง„๋‹ค.

๐Ÿ“ค์ถœ๋ ฅ ์กฐ๊ฑด

  • ์ธ๊ตฌ ์ด๋™์ด ๋ฉฐ์น  ๋™์•ˆ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ฒซ์งธ ์ค„์— ์ถœ๋ ฅํ•œ๋‹ค.

โ–ซ๏ธ ์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

  • ์ž…๋ ฅ 1
2 20 50
50 30
20 40
  • ์ถœ๋ ฅ 1
1


  • ์ž…๋ ฅ 2
2 40 50
50 30
20 40
  • ์ถœ๋ ฅ 2
0

๊ฒฝ๊ณ„๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋‚˜๋ผ์˜ ์ธ๊ตฌ ์ฐจ์ด๊ฐ€ ๋ชจ๋‘ L๋ณด๋‹ค ์ž‘์•„์„œ ์ธ๊ตฌ ์ด๋™์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.


  • ์ž…๋ ฅ 3
2 20 50
50 30
30 40
  • ์ถœ๋ ฅ 3
1


  • ์ž…๋ ฅ 4
3 5 10
10 15 20
20 30 25
40 22 10
  • ์ถœ๋ ฅ 4
2

  • ์ž…๋ ฅ 5
4 10 50
10 100 20 90
80 100 60 70
70 20 30 40
50 20 100 10
  • ์ถœ๋ ฅ 5
3


๋ฌธ์ œ ์ดํ•ด


  • ์ธ๊ตฌ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋ฉด, ์ธ๊ตฌ ์ด๋™์ด ๋ช‡ ๋ฒˆ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ


์•Œ๊ณ ๋ฆฌ์ฆ˜


์‹ค์ œ ํ’€์ด ์‹œ๊ฐ„ : 40๋ถ„

  • ์ž…๋ ฅ

    • N, L, R ์ž…๋ ฅ๋ฐ›๊ธฐ
    • ์ธ๊ตฌ์ˆ˜ ๋ฐฐ์—ด ์ž…๋ ฅ๋ฐ›๊ธฐ
  • ๊ณ„์‚ฐ

    • dfs ์‹คํ–‰ํ•˜๊ธฐ
  • ์ถœ๋ ฅ

    • ์ธ๊ตฌ ์ด๋™ ๋ฐœ์ƒ ์ˆ˜ ์ถœ๋ ฅํ•˜๊ธฐ
  • ๋ณ„๋„ ๋ฉ”์„œ๋“œ

    • dfs
      • ๋ฐ–์œผ๋กœ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ ๋ฌด์‹œ
      • ์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰ํ•ด ๋ฐฉ๋ฌธ ํ‘œ์‹œํ•˜๊ธฐ
import java.util.*;

public class Main {
    static int N;
    static int L;
    static int R;

    static int[][] arr;

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        N = sc.nextInt();
        L = sc.nextInt();
        R = sc.nextInt();

        sc.nextLine();

        arr = new int[N][N];
        for(int i=0; i<N; i++){
            String land = sc.nextLine();
            for(int j=0; j<N; j++){
                arr[i][j] = land.charAt(j) - '0';
            }
        }

        int result = 0;
        for(int i=0; i<N; i++){
            for(int j=0; j<N; j++){
                if(dfs(i,j)) {
                    result++;
                }
            }
        }
        System.out.println(result);
    }

    public static boolean dfs(int i, int j) {
        if (i <= -1 || i >= N || j <= -1 || j >= N) {//ํ‹€ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐˆ ๊ฒฝ์šฐ
            return false;
        }

        if (arr[i][j] == 0) {
            arr[i][j] = 1; //๋ฐฉ๋ฌธ

            dfs(i + 1, j);
            dfs(i - 1, j);
            dfs(i, j + 1);
            dfs(i, j - 1);

            return true;
        }
        return false;
    }
}


์˜ค๋‹ต์ฒดํฌ


  • BFS ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•ด ํ’€์ด
public static int bfs(int x, int y) {
  Queue<int[]> queue = new LinkedList<>();
  union = new ArrayList<>();

  queue.offer(new int[]{x, y});
  visited[x][y] = true;

  int sum = arr[x][y];
  while (!queue.isEmpty()) {
      int[] current = queue.poll();
      x = current[0];
      y = current[1];

      union.add(current);

      for (int i = 0; i < 4; i++) {
          int nx = x + dx[i];
          int ny = y + dy[i];
          if (nx >= 0 && ny >= 0 && nx < N && ny < N && !visited[nx][ny]) {
              int population = Math.abs(arr[x][y] - arr[nx][ny]);
              if (L <= population && population <= R) {
                  queue.offer(new int[]{nx, ny});
                  visited[nx][ny] = true;
                  sum += arr[nx][ny];
              }
          }
      }
  }
  return sum;
}
  • ๋ณ„๋„ ๋ฉ”์„œ๋“œ move() ๋ฐ change() ๊ตฌํ˜„
    • move() : ์ธ๊ตฌ ์ด๋™์ด ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•  ๋ฉ”์„œ๋“œ
    • change() : ์ธ๊ตฌ ์ด๋™ ํ›„์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•  ๋ฉ”์„œ๋“œ
public static int move() {
  int result = 0;
  while (true) {
      boolean isMove = false;
      visited = new boolean[N][N];
      for (int i = 0; i < N; i++) {
          for (int j = 0; j < N; j++) {
              if (!visited[i][j]) {
                  int sum = bfs(i, j);
                  if (union.size() > 1) {
                      change(sum);
                      isMove = true;
                  }
              }
          }
      }
      if (!isMove) return result;
      result++;
  }
}

public static void change(int sum) {
  int average = sum / union.size();
  for (int[] coord : union) {
      arr[coord[0]][coord[1]] = average;
  }
}


์ตœ์ข… ํ’€์ด


์‹ค์ œ ํ’€์ด ์‹œ๊ฐ„ : 1์‹œ๊ฐ„ 20๋ถ„(์ฒซ ํ’€์ด ์‹œ๊ฐ„ ํฌํ•จ)

  • ์ž…๋ ฅ

    • N, L, R ์ž…๋ ฅ๋ฐ›๊ธฐ
    • ์ธ๊ตฌ์ˆ˜ ๋ฐฐ์—ด ์ž…๋ ฅ๋ฐ›๊ธฐ
  • ๊ณ„์‚ฐ

    • BFS ์‹คํ–‰ํ•˜๊ธฐ
  • ์ถœ๋ ฅ

    • ์ธ๊ตฌ ์ด๋™ ๋ฐœ์ƒ ์ˆ˜ ์ถœ๋ ฅํ•˜๊ธฐ
  • ๋ณ„๋„ ๋ฉ”์„œ๋“œ

    • BFS
      • ๋ฐ–์œผ๋กœ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ ๋ฌด์‹œ
      • ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•˜์—ฌ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ง€์  ํƒ์ƒ‰
      • ํƒ์ƒ‰ํ•œ ์ง€์ ์˜ ์ธ๊ตฌ ์ฐจ์ด๊ฐ€ L ์ด์ƒ R ์ดํ•˜์ธ ๊ฒฝ์šฐ -> ์ด๋™ ๊ฐ€๋Šฅ
      • ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ง€์ ์ด ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ์ง€์ ๋ถ€ํ„ฐ DFS ์žฌ๊ท€ ํ˜ธ์ถœํ•ด ์ธ๊ตฌ ์ด๋™ ํ™•์ธ
      • DFS๋ฅผ ํ†ตํ•ด ์—ฐํ•ฉ ๊ตฌ์„ฑ, ์—ฐํ•ฉ ์ธ๊ตฌ ์กฐ์ •ํ•ด ์ธ๊ตฌ ์ด๋™ ์ˆ˜ํ–‰ํ•˜๊ธฐ
    • move()
      • ๋” ์ด์ƒ ์ธ๊ตฌ ์ด๋™์ด ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
      • bfs๋กœ ์—ด๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ตญ๊ฒฝ์„  ํ™•์ธํ•˜๋ฉฐ ์ธ๊ตฌ ์ด๋™ํ•  ์ด ์ธ๊ตฌ์ˆ˜ ๋ฐ˜ํ™˜
      • ์—ด๋ฆฐ ๊ตญ๊ฒฝ์„  ๋‚ด์˜ ๋…ธ๋“œ๋“ค ์ธ๊ตฌ ๋ณ€๊ฒฝ
    • change()
      • ์ธ๊ตฌ ์ด๋™ ํ›„ ์‹ค์ œ ๊ณ„์‚ฐ ์ง„ํ–‰
import java.util.*;

public class Main {
    static int N;
    static int L;
    static int R;

    static int[][] arr;
    static boolean[][] visited;

    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};

    static ArrayList<int[]> union;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        N = sc.nextInt();
        L = sc.nextInt();
        R = sc.nextInt();

        sc.nextLine();

        arr = new int[N][N];
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                arr[i][j] = sc.nextInt();
            }
        }

        System.out.println(move());
    }

    public static int bfs(int x, int y) {
        Queue<int[]> queue = new LinkedList<>();
        union = new ArrayList<>();

        queue.offer(new int[]{x, y});
        visited[x][y] = true;

        int sum = arr[x][y];
        while (!queue.isEmpty()) {
            int[] current = queue.poll();
            x = current[0];
            y = current[1];

            union.add(current);

           for (int i = 0; i < 4; i++) {
              int nx = x + dx[i];
              int ny = y + dy[i];
              if (nx >= 0 && ny >= 0 && nx < N && ny < N && !visited[nx][ny]) {
                 int population = Math.abs(arr[x][y] - arr[nx][ny]);

                 if (L <= population && population <= R) {
                    queue.offer(new int[]{nx, ny});
                    visited[nx][ny] = true;
                    sum += arr[nx][ny];
                 }
              }
           }
        }
        return sum;
    }

    public static int move() {
        int result = 0;
        while (true) {
            boolean isMove = false;
            visited = new boolean[N][N];
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    if (!visited[i][j]) {
                        int sum = bfs(i, j);
                        if (union.size() > 1) {
                            change(sum);
                            isMove = true;
                        }
                    }
                }
            }
            if (!isMove) return result;
            result++;
        }
    }

    public static void change(int sum) {
        int average = sum / union.size();
        for (int[] coord : union) {
            arr[coord[0]][coord[1]] = average;
        }
    }
}

profile
์–ธ์  ๊ฐ€ ๋‚ด ์ฝ”๋“œ๋กœ ์„ธ์ƒ์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋„๋ก, BE&Data Science ๊ฐœ๋ฐœ ๊ธฐ๋ก ๋…ธํŠธโ˜˜๏ธ

0๊ฐœ์˜ ๋Œ“๊ธ€