Algorithm

๋ฐฑ์ค€ 2933๋ฒˆ : ๋ฏธ๋„ค๋ž„ | JAVA

Yunny52 2023. 3. 27. 15:35

 

๐Ÿ“Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ

์ •๋ง ์–ด๋ ค์šด ๋ฌธ์ œ์˜€๋‹ค ... ์‚ฌ์‹ค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋Š” 30๋ถ„ ์•ˆ์— ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ์„ ๊ฒฝ์šฐ, ํ’€์ด๋ฅผ ๋ณด๊ณ  ๋งˆ๋ฌด๋ฆฌ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ด์ƒ์ ์ด๋ผ๊ณ  ์•Œ๋ ค์ ธ ์žˆ์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” ๋ฉฐ์น ์„ ๋ถ™์žก๊ณ  ๋ณธ ๊ฒƒ ๊ฐ™๋‹ค. ํ‘ํ‘

 

์šฐ์„ , ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ๊ณ„๋ฅผ ์ •๋ฆฌํ•ด๋ณด์ž.

  1. ์ฃผ์–ด์ง„ ๋†’์ด์™€ ๋ฐฉํ–ฅ์˜ ๋ฏธ๋„ค๋ž„ ํŒŒ๊ดด
  2. ํŒŒ๊ดด๋œ ์‹œ์ ์—์„œ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๊ณต์ค‘์— ๋– ์žˆ๋Š”์ง€ ํ™•์ธ
  3. ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๊ณต์ค‘์— ๋– ์žˆ๋‹ค๋ฉด ๋ฐ‘์œผ๋กœ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๋‚ด๋ฆฌ๊ธฐ

์œ„ ์ž‘์—…์„ N๋ฒˆ(๋ง‰๋Œ€๋ฅผ ๋˜์ง„ ํšŸ์ˆ˜)๋งŒํผ ๋ฐ˜๋ณตํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด BFS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ ๊ตฌํ˜„์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

 


๐Ÿ“Œ ํ’€์ด

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด, ์ด ๋ฌธ์ œ๋Š” 3๋‹จ๊ณ„๋ฅผ N๋ฒˆ(๋ง‰๋Œ€๋ฅผ ๋˜์ง„ ํšŸ์ˆ˜)๋งŒํผ ๋ฐ˜๋ณตํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

  1. ์ฃผ์–ด์ง„ ๋†’์ด์™€ ๋ฐฉํ–ฅ์˜ ๋ฏธ๋„ค๋ž„ ํŒŒ๊ดด
  2. ํŒŒ๊ดด๋œ ์‹œ์ ์—์„œ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๊ณต์ค‘์— ๋– ์žˆ๋Š”์ง€ ํ™•์ธ
  3. ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๊ณต์ค‘์— ๋– ์žˆ๋‹ค๋ฉด ๋ฐ‘์œผ๋กœ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๋‚ด๋ฆฌ๊ธฐ

 

1๋ฒˆ ๋‹จ๊ณ„์˜ ๊ฒฝ์šฐ, 'x'๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ '.'๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋˜๊ธฐ์— ๊ฝค ๊ฐ„๋‹จํ•œ ์ž‘์—…์ด๋‹ค.

 

2๋ฒˆ ๋‹จ๊ณ„๊ฐ€ ๊นŒ๋‹ค๋กœ์šด๋ฐ, ์šฐ์„  ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด BFS๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ด๋ฃจ๋Š” ๋ฏธ๋„ค๋ž„์˜ row ์œ„์น˜๋ฅผ ํ™•์ธํ•˜์—ฌ, ์ตœ๋Œ“๊ฐ’(๊ฐ€์žฅ ๋‚ฎ์€ ์œ„์น˜)๊ฐ€ R-1์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๊ณต์ค‘์— ๋– ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ  3๋ฒˆ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜์˜€๋‹ค.

๋ฌธ์ œ์—์„œ ๋‘ ๊ฐœ ๋˜๋Š” ๊ทธ ์ด์ƒ์˜ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋™์‹œ์— ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค๊ณ  ๋ช…์‹œํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ๋– ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ๋”์ด์ƒ ์ฐพ์•„๋ณด์ง€ ์•Š๊ณ  return ํ•˜์ž.

 

3๋ฒˆ ๋‹จ๊ณ„์˜ ๊ฒฝ์šฐ, ๋ช‡ ์นธ์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋Š”์ง€ ๋จผ์ € ํŒ๋‹จํ•ด์•ผ ํ•œ๋‹ค. ์šฐ์„  ์›๋ž˜ ์ž๋ฆฌ์— ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ชจ๋‘ '.'์œผ๋กœ ๋ฐ”๊ฟ” ์ง€์šด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ ์นธ์”ฉ ๋‚ด๋ ค๋ณด๋ฉด์„œ ๋ฐ”๋‹ฅ์ด๋‚˜ ๋‹ค๋ฅธ ๋ฏธ๋„ค๋ž„๊ณผ ๋‹ฟ์„ ๊ฒฝ์šฐ ๋”์ด์ƒ ๋‚ด๋ ค๊ฐˆ ์ˆ˜ ์—†๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ , ๋‚ด๋ ค๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์นธ ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ–ˆ๋‹ค. ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ชจ๋‘ ์ง€์šด ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋Š” ์นธ ์ˆ˜ ๋งŒํผ ๋‚ด๋ ค์„œ ๋‹ค์‹œ 'x'๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. 

 


๐Ÿ“Œ ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

    static class Loc {
        int i;
        int j;

        public Loc(int i, int j) {
            this.i = i;
            this.j = j;
        }
    }

    static int height;
    static int width;
    static char[][] graph;
    static int[][] clusters;
    static int stick;

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        height = Integer.parseInt(st.nextToken());
        width = Integer.parseInt(st.nextToken());
        graph = new char[height][width];

        for(int i = 0; i < height; i++) {
            graph[i] = br.readLine().toCharArray();
        }

        int chance = Integer.parseInt(br.readLine());
        st = new StringTokenizer(br.readLine(), " ");
        for(int i = 0; i < chance; i++) {
            stick = Integer.parseInt(st.nextToken());
            destroyMineral(stick, i%2==0?1:2);
            setCluster();
        }

        // ๊ฒฐ๊ณผ ์ถœ๋ ฅ
        for(int i = 0; i < height; i++) {
            System.out.println(graph[i]);
        }

    }

    public static void destroyMineral(int stick, int dir) {

        // dir์ด 1์ด๋ฉด ์™ผ์ชฝ
        if(dir == 1) {
            for(int i = 0; i < width; i++) {
                if(graph[height-stick][i] == 'x') {
                    graph[height-stick][i] = '.';
                    return;
                }
            }
        }

        // dir์ด 2์ด๋ฉด ์˜ค๋ฅธ์ชฝ
        else {
            for(int i = width-1; i >=0; i--) {
                if(graph[height-stick][i] == 'x') {
                    graph[height-stick][i] = '.';
                    return;
                }
            }
        }

    }

    public static void setCluster() {

        clusters = new int[height][width]; // 0์œผ๋กœ ์ดˆ๊ธฐํ™” ๋จ
        int clusterNum = 1;
        for(int i = 0; i < height; i++) {
            for(int j = 0; j < width; j++) {
                if(graph[i][j] == 'x' && clusters[i][j] == 0) {
                    // ๋– ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ฐœ๊ฒฌํ•  ๊ฒฝ์šฐ
                    if(findCluster(i, j, clusterNum))
                        return;
                    clusterNum++;
                }
            }
        }

    }

    public static boolean findCluster(int i, int j, int clusterNum) {

        int[] di = {0, 0, -1, 1};
        int[] dj = {1, -1, 0, 0};

        int lowest = -1;

        Queue<Loc> q = new LinkedList<>();
        ArrayList<Loc> arr = new ArrayList<>();

        q.add(new Loc(i, j));
        clusters[i][j] = clusterNum;

        // bfs๋กœ ํด๋Ÿฌ์Šคํ„ฐ ์ฐพ๊ธฐ
        while(!q.isEmpty()) {
            Loc now = q.poll();
            lowest = Math.max(lowest, now.i);

            for(int d = 0; d < 4; d++) {
                int ni = now.i + di[d];
                int nj = now.j + dj[d];

                if(ni < 0 || nj < 0 || ni >= height || nj >= width)
                    continue;

                if(clusters[ni][nj] == 0 && graph[ni][nj] == 'x') {
                    clusters[ni][nj] = clusterNum;
                    q.add(new Loc(ni, nj));
                }
            }

            // ํ•˜๋‚˜์˜ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ arr
            arr.add(now);

        }

        // ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ€์žฅ ์•„๋ž˜๊ฐ€ ๋ฐ”๋‹ฅ๊ณผ ๋งž๋‹ฟ์•„์žˆ์ง€ ์•Š์„ ๊ฒฝ์šฐ, ํด๋Ÿฌ์Šคํ„ฐ ์ด๋™
        if(lowest != height-1) {
            moveCluster(arr);
            return true;
        }

        return false;

    }

    public static void moveCluster(ArrayList<Loc> arr) {

        int move = 1;

        // ์›๋ž˜ ์ž๋ฆฌ์— ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ง€์šฐ๊ธฐ
        for(Loc loc : arr) {
            graph[loc.i][loc.j] = '.';
        }

        outerLoop:
        while(true) {
            for(Loc loc : arr) {
                // ๋ฐ‘์œผ๋กœ ํ•œ์นธ ๋‚ด๋ ธ์„ ๋•Œ ๋ฐ”๋‹ฅ ๋„˜์–ด๊ฐ€๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํด๋Ÿฌ์Šคํ„ฐ๋ž‘ ๊ฒน์น˜๊ธฐ ์ „๊นŒ์ง€๋งŒ ๋‚ด๋ฆฌ๊ธฐ
                if(loc.i + move == height || graph[loc.i + move][loc.j] == 'x') {
                    move--;
                    break outerLoop;
                }
            }
            move++;
        }

        // ์—…๋ฐ์ดํŠธ
        for(Loc loc : arr) {
            graph[loc.i + move][loc.j] = 'x';
        }

    }

}