๐Ÿ“‚์ฝ”๋”ฉํ…Œ์ŠคํŠธ:CodingTest

BFS (๋ฐฑ์ค€ 16234 ์ธ๊ตฌ์ด๋™)

mc.thd 2024. 2. 9. 14:00

https://www.acmicpc.net/problem/16234

 

16234๋ฒˆ: ์ธ๊ตฌ ์ด๋™

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

www.acmicpc.net

 

 

ํ’€์ด์ˆœ์„œ

0. ํ•˜๋ฃจ๋งˆ๋‹ค NxNํฌ๊ธฐ์˜ ๋•…์„ ํ™•์ธํ•˜๋ฉฐ ๊ตญ๊ฒฝ์„ ํ—ˆ๋ฌผ์—ˆ๋Š”์ง€ ํ™•์ธ

while(true){
            if(!solve()){ // ๊ตญ๊ฒฝ ํ—ˆ๋ฌผ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊ตญ๊ฒฝ ํ—ˆ๋ฌผ๊ณ  ์ธ๊ตฌ์ˆ˜ ๊ฐฑ์‹ 
                break;
            }
            ans+=1;
        }
  • ํ•˜๋ฃจ๋งˆ๋‹ค (0,0)์—์„œ bfs๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๊ตญ๊ฒฝ์„ ํ—ˆ๋ฌผ๊ณ  ์ธ๊ตฌ๋ฅผ ์ด๋™์‹œ์ผฐ๋‹ค.
static boolean solve(){
        visited = new boolean[N][N];
        int flag = 0; // ๊ตญ๊ฒฝ์„ ํ—ˆ๋ฌผ์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” flag ๋ณ€์ˆ˜

        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                if(!visited[i][j]){
                    visited[i][j] = true;
                    int[] result = bfs(i,j); // bfs๋ฅผ ๋Œ๋ฉด์„œ ๊ตญ๊ฒฝ์„ ํ—ˆ๋ฌผ๊ณ  (๋„์‹œ์˜ ๊ฐฏ์ˆ˜, ๋„์‹œ ์ธ๊ตฌ์ˆ˜ ํ•ฉ) ์„ ๋ฐ˜ํ™˜
                    if(result[0] > 1){ // ๋ฒฝ์„ ํ—ˆ๋ฌธ ์ ์ด ์žˆ์œผ๋ฉด
                        spread(result[1]/result[0]); // history ํ ํ™œ์šฉํ•ด์„œ ์ธ๊ตฌ์ด๋™ ์‹œํ‚ค๊ธฐ
                        flag = 1;
                    }
                }
            }
        }

        if(flag==1) return true;

        return false;
    }
  • ๋ณดํ†ต์˜ bfsํ•จ์ˆ˜์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ (๊ตญ๊ฒฝ ํ—ˆ๋ฌธ ๋„์‹œ์˜ ๊ฐฏ์ˆ˜, ํ—ˆ๋ฌธ ๋„์‹œ ์ธ๊ตฌ์ˆ˜์˜ ํ•ฉ) ์„ ๋ฆฌํ„ดํ•ด์คฌ๋‹ค.
  • bfsํ•จ์ˆ˜ : ๊ตญ๊ฒฝ์„ ํ—ˆ๋ฌผ๊ธฐ
  • spreadํ•จ์ˆ˜ : ํ—ˆ๋ฌผ์–ด์ง„ ๊ตญ๊ฐ€ ์ธ๊ตฌ์ˆ˜ ๊ฐฑ์‹ 

 

1. BFS๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ตญ๊ฒฝ์„ ํ—ˆ๋ฌผ๊ธฐ

static int[] bfs(int r,int c){
        Deque<int[]> q = new ArrayDeque<>();
        history = new ArrayDeque<>(); // bfs์ˆ˜ํ–‰ ํ•  ๋•Œ ์ด๋™ ํ–ˆ๋˜ ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ํ

        q.offer(new int[]{r,c});
        history.offer(new int[]{r,c});

        int cnt = 0;
        int sum = 0;

        while(!q.isEmpty()){
            int[] cur = q.pollFirst();
            int cr = cur[0];
            int cc = cur[1];
            cnt+=1;
            sum += arr[cr][cc];

            for(int d=0;d<4;d++){
                int nr = cr + dr[d];
                int nc = cc + dc[d];
                if(nr<0 || nr>=N) continue;
                if(nc<0 || nc>=N) continue;
                if(visited[nr][nc]) continue;

                int gap = Math.abs(arr[cr][cc] - arr[nr][nc]);
                if(gap<L || gap>R) continue;

                visited[nr][nc]=true;
                q.offer(new int[]{nr,nc});
                history.offer(new int[]{nr,nc}); // ํ๊ฐ€ ๋ฐฉ๋ฌธํ•œ ์œ„์น˜๋“ค ๋‹ค ์ €์žฅ

            }
        }

        return new int[]{cnt,sum};

    }
  • ๊ตญ๊ฒฝ์„ ํ—ˆ๋ฌผ๋ฉด์„œ, ๋ฐฉ๋ฌธํ•œ ๋„์‹œ์˜ ๊ฐฏ์ˆ˜(cnt)์™€ ์ธ๊ตฌ์ˆ˜์˜ ํ•ฉ(sum)์„ ์ €์žฅํ•˜๊ณ  ๋ฆฌํ„ด
  • historyํ์— ๋ฐฉ๋ฌธํ•œ ์ขŒํ‘œ๋“ค์„ ์ €์žฅ (๊ตญ๊ฒฝ์ด ํ—ˆ๋ฌผ์–ด์ง„ ๊ตญ๊ฐ€ ์ธ๊ตฌ์ˆ˜ ๊ฐฑ์‹ ์„ ์œ„ํ•ด์„œ)

 

2. ๊ตญ๊ฒฝ์ด ํ—ˆ๋ฌผ์–ด์ง„ ๋‚˜๋ผ๋“ค์˜ ์ธ๊ตฌ์ˆ˜๋ฅผ updateํ•ด์ฃผ๊ธฐ (historyํ ํ™œ์šฉ)

static boolean solve(){
        visited = new boolean[N][N];
        int flag = 0; // ๊ตญ๊ฒฝ์„ ํ—ˆ๋ฌผ์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” flag ๋ณ€์ˆ˜

        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                if(!visited[i][j]){
                    visited[i][j] = true;
                    int[] result = bfs(i,j); // bfs๋ฅผ ๋Œ๋ฉด์„œ ๊ตญ๊ฒฝ์„ ํ—ˆ๋ฌผ๊ณ  (๋„์‹œ์˜ ๊ฐฏ์ˆ˜, ๋„์‹œ ์ธ๊ตฌ์ˆ˜ ํ•ฉ) ์„ ๋ฐ˜ํ™˜
                    if(result[0] > 1){ // ๋ฒฝ์„ ํ—ˆ๋ฌธ ์ ์ด ์žˆ์œผ๋ฉด
                        spread(result[1]/result[0]); // history ํ ํ™œ์šฉํ•ด์„œ ์ธ๊ตฌ์ด๋™ ์‹œํ‚ค๊ธฐ
                        flag = 1;
                    }
                }
            }
        }

        if(flag==1) return true;

        return false;
    }
  • result[0] ๊ฐ’ ์ฆ‰ cnt๊ฐ’์„ ํ†ตํ•ด์„œ ๊ตญ๊ฒฝ์„ ํ—ˆ๋ฌผ์—ˆ๋‹ค๋ฉด, spread ํ•จ์ˆ˜์—์„œ ์ธ๊ตฌ์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•ด์คฌ๋‹ค.
  • flag๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ด๋ฒˆ ํ•˜๋ฃจ๋™์•ˆ ๊ตญ๊ฒฝ์„ ํ—ˆ๋ฌธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋ฉด true, ์•„๋‹ˆ๋ฉด false๋ฅผ ๋ฆฌํ„ดํ–ˆ๋‹ค.
static void spread(int val){
        while(!history.isEmpty()){
            int[] a = history.pollFirst();
            arr[a[0]][a[1]] = val;
        }
    }
  • bfs ํ•จ์ˆ˜์—์„œ ์ €์žฅํ•ด์คฌ๋˜ historyํ๋ฅผ ์ด์šฉ

bfs๋ฅผ ํ•œ ๋ฒˆ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ (0,0)๋ถ€ํ„ฐ ๊ณ„์† ์ƒˆ๋กญ๊ฒŒ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์ ์—์„œ ์ƒˆ๋กœ์šด ๋ฌธ์ œ์˜€๋‹ค.

๋˜ ์ธ๊ตฌ์ˆ˜ ๊ฐฑ์‹ ์„ ์œ„ํ•ด historyํ์— ๋ฐฉ๋ฌธํ•œ ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•ด์ค˜์•ผ ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์ „์ฒด์ฝ”๋“œ

package com.mincheolsong;
import java.io.*;
import java.util.*;


public class Main {

    static int N,L,R;
    static int[][] arr;
    static boolean[][] visited; // bfs ์ˆ˜ํ–‰ ์‹œ ์‚ฌ์šฉํ•  visited ๋ฐฐ์—ด
    static int[] dr = {-1,0,1,0};
    static int[] dc = {0,1,0,-1};
    static int ans;
    static Deque<int[]> history;


    static int[] bfs(int r,int c){
        Deque<int[]> q = new ArrayDeque<>();
        history = new ArrayDeque<>(); // bfs์ˆ˜ํ–‰ ํ•  ๋•Œ ์ด๋™ ํ–ˆ๋˜ ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ํ

        q.offer(new int[]{r,c});
        history.offer(new int[]{r,c});

        int cnt = 0;
        int sum = 0;

        while(!q.isEmpty()){
            int[] cur = q.pollFirst();
            int cr = cur[0];
            int cc = cur[1];
            cnt+=1;
            sum += arr[cr][cc];

            for(int d=0;d<4;d++){
                int nr = cr + dr[d];
                int nc = cc + dc[d];
                if(nr<0 || nr>=N) continue;
                if(nc<0 || nc>=N) continue;
                if(visited[nr][nc]) continue;

                int gap = Math.abs(arr[cr][cc] - arr[nr][nc]);
                if(gap<L || gap>R) continue;

                visited[nr][nc]=true;
                q.offer(new int[]{nr,nc});
                history.offer(new int[]{nr,nc}); // ํ๊ฐ€ ๋ฐฉ๋ฌธํ•œ ์œ„์น˜๋“ค ๋‹ค ์ €์žฅ

            }
        }

        return new int[]{cnt,sum};

    }

    static void spread(int val){
        while(!history.isEmpty()){
            int[] a = history.pollFirst();
            arr[a[0]][a[1]] = val;
        }
    }
    static boolean solve(){
        visited = new boolean[N][N];
        int flag = 0; // ๊ตญ๊ฒฝ์„ ํ—ˆ๋ฌผ์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” flag ๋ณ€์ˆ˜

        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                if(!visited[i][j]){
                    visited[i][j] = true;
                    int[] result = bfs(i,j); // bfs๋ฅผ ๋Œ๋ฉด์„œ ๊ตญ๊ฒฝ์„ ํ—ˆ๋ฌผ๊ณ  (๋„์‹œ์˜ ๊ฐฏ์ˆ˜, ๋„์‹œ ์ธ๊ตฌ์ˆ˜ ํ•ฉ) ์„ ๋ฐ˜ํ™˜
                    if(result[0] > 1){ // ๋ฒฝ์„ ํ—ˆ๋ฌธ ์ ์ด ์žˆ์œผ๋ฉด
                        spread(result[1]/result[0]); // history ํ ํ™œ์šฉํ•ด์„œ ์ธ๊ตฌ์ด๋™ ์‹œํ‚ค๊ธฐ
                        flag = 1;
                    }
                }
            }
        }

        if(flag==1) return true;

        return false;
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        L = Integer.parseInt(st.nextToken());
        R = Integer.parseInt(st.nextToken());

        arr = new int[N][N];
        ans = 0;

        for(int i=0;i<N;i++){
            st = new StringTokenizer(br.readLine());
            for(int j=0;j<N;j++){
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }


        while(true){
            if(!solve()){ // ๊ตญ๊ฒฝ ํ—ˆ๋ฌผ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊ตญ๊ฒฝ ํ—ˆ๋ฌผ๊ณ  ์ธ๊ตฌ์ˆ˜ ๊ฐฑ์‹ 
                break;
            }
            ans+=1;
        }

        System.out.println(ans);

    }

}