[BOJ 16234] ์ธ๊ตฌ์ด๋™

 

1. ๋ฌธ์ œ : https://www.acmicpc.net/problem/1103

 

2. ํ’€์ด

list์— ๋…ธ๋“œ๋ฅผ ๋„ฃ์–ด์„œ ๊ทธ ๋…ธ๋“œ๋งŒ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ๋‹ค.

 

3. ์ฝ”๋“œ

package baekjoon;

import java.util.*;

public class Main {

    static int n, l, r;
    static int[][] board;
    static boolean[][] visited;
    static int[] dx = {0, 1, 0, -1};
    static int[] dy = {1, 0, -1, 0};
    static ArrayList<Node> list; //์ธ๊ตฌ ์ด๋™์ด ํ•„์š”ํ•œ ๋…ธ๋“œ ๋ฆฌ์ŠคํŠธ

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

        n = scan.nextInt();
        l = scan.nextInt();
        r = scan.nextInt();

        board = new int[n][n];
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                board[i][j] = scan.nextInt();
            }
        }

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

    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); //bfsํƒ์ƒ‰์œผ๋กœ ์—ด๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ตญ๊ฒฝ์„  ํ™•์ธ ํ•˜๋ฉฐ ์ธ๊ตฌ ์ด๋™ํ•  ์ด ์ธ๊ตฌ์ˆ˜ ๋ฐ˜ํ™˜
                        if(list.size() > 1) {
                            changePopulation(sum); //์—ด๋ฆฐ ๊ตญ๊ฒฝ์„  ๋‚ด์˜ ๋…ธ๋“œ๋“ค ์ธ๊ตฌ ๋ณ€๊ฒฝ
                            isMove = true;
                        }
                    }
                }
            }
            if(!isMove) return result;;
            result++;
        }
    }

    public static int bfs(int x, int y) {
        Queue<Node> q = new LinkedList<>();
        list = new ArrayList<>();

        q.offer(new Node(x, y));
        list.add(new Node(x, y));
        visited[x][y] = true;

        int sum = board[x][y];
        while(!q.isEmpty()) {
            Node current = q.poll();

            for(int i = 0; i < 4; i++) {
                int nx = current.x + dx[i];
                int ny = current.y + dy[i];
                if(nx >= 0 && ny >= 0 && nx < n && ny < n && !visited[nx][ny]) {
                    int diff = Math.abs(board[current.x][current.y] - board[nx][ny]);
                    if(l <= diff && diff <= r) {
                        q.offer(new Node(nx, ny));
                        list.add(new Node(nx, ny));
                        sum += board[nx][ny];
                        visited[nx][ny] = true;
                    }
                }
            }
        }
        return sum;
    }

    public static void changePopulation(int sum) {
        int avg = sum / list.size();
        for(Node n : list) {
            board[n.x][n.y] = avg;
        }
    }

    public static class Node {
        int x;
        int y;

        public Node(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
}
  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ๋„ค์ด๋ฒ„ ๋ฐด๋“œ์— ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ ๊ณต์œ ํ•˜๊ธฐ