๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

https://softeer.ai/practice/info.do?idx=1&eid=411&sw_prbl_sbms_sn=180543 

 

Softeer

์—ฐ์Šต๋ฌธ์ œ๋ฅผ ๋‹ด์„ Set์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”. ์ทจ์†Œ ํ™•์ธ

softeer.ai


1. ๋ฌธ์ œ

NxM ํฌ๊ธฐ์˜ map์ด ์ฃผ์–ด์ง„๋‹ค.

์ •์‚ฌ๊ฐํ˜•์˜ 2๊ฐœ ์ด์ƒ์˜ ๋ณ€์ด ์™ธ๋ถ€ ๊ณต๊ธฐ์™€ ์ ‘์ด‰ํ–ˆ์„ ๋•Œ ๋…น๊ณ , ํ•ด๋‹น ์–ผ์Œ๋“ค์€ ํ•œ ์‹œ๊ฐ„ ๋งŒ์— ๋…น๋Š”๋‹ค.

์–ผ์Œ์ด ๋ชจ๋‘ ๋…น์•„ ์—†์–ด์ง€๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ •ํ™•ํ•œ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•˜๋ผ.

check point

1. ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ณต๊ฐ„์€ ์™ธ๋ถ€ ๊ณต๊ธฐ์™€ ์ ‘์ด‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•œ๋‹ค.

2. ๋งจ ๊ฐ€์žฅ์ž๋ฆฌ์—๋Š” ์–ผ์Œ์ด ๋†“์ด์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•œ๋‹ค.

 

2. ํ’€์ด

bfs๋ฌธ์ œ์ด๋‹ค.

๋ฐฑ์ค€ ์น˜์ฆˆ์ฒ˜๋Ÿผ ํ’€๋ ค๊ณ  ํ•˜์˜€์œผ๋‚˜ (์™ธ๋ถ€ ๊ณต๊ธฐ bfs, ์–ผ์Œ bfs, ๋…น์„ ์–ผ์Œ ๋”ฐ๋กœ ํ์— ๋‹ด๊ณ  bfs ๋๋‚˜๋ฉด ํ ์•ˆ์— ๋“ค์€ ๊ฒƒ๋“ค ๋…น์€ ๊ฑธ๋กœ ์ฒ˜๋ฆฌ)์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ณด๋‹ˆ๊นŒ (์ด์ค‘for๋ฌธ+bfs ํ•˜๋‚˜)๋กœ ํ’€์—ˆ๊ธธ๋ž˜ ์ฐธ๊ณ ํ•ด์„œ ํ’€์—ˆ๋‹ค.

 

๋ฐฉ๋ฒ•์€

1. ์™ธ๋ถ€ ๊ณต๊ธฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ bfs์˜ ์‹œ์ž‘์ ์€ ๋งค๋ฒˆ 0,0์ด ๋œ๋‹ค. (๊ฐ€์žฅ์ž๋ฆฌ์—๋Š” ์–ผ์Œ์ด ์—†๊ธฐ ๋•Œ๋ฌธ)

2. ์™ธ๋ถ€ ๊ณต๊ธฐ๋ฅผ ๋”ฐ๋ผ์„œ bfs๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ map์˜ ๊ฐ’์ด 1์ธ ์ง€์ , ์ฆ‰ ์–ผ์Œ์ธ ์ง€์ ์„ ๋งŒ๋‚˜๊ฒŒ ๋œ๋‹ค.

์ด ๋•Œ visited๋ฅผ 1 ๋Š˜๋ ค์ฃผ๊ณ  queue์—๋Š” ๋„ฃ์ง€ ์•Š๋Š”๋‹ค. ๋ฐ˜๋ฉด์— ๋˜‘๊ฐ™์€ ์™ธ๋ถ€๊ณต๊ธฐ๋ฅผ ๋งŒ๋‚˜๋ฉด visited์— 1์ฆ๊ฐ€๊ฐ€ ์•„๋‹ˆ๋ผ 1์„ ๊ฐ’์œผ๋กœ ๋„ฃ์–ด์ฃผ๊ณ  queue์— ์ถ”๊ฐ€ํ•ด์ฃผ์–ด ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.

3. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด map์„ ๊ณ„์†ํ•ด์„œ ํƒ์ƒ‰ํ•˜๋‹ค๊ฐ€ ํ•ด๋‹น ์–ผ์Œ ์ง€์ ์„ ๋‹ค์‹œ ๋งŒ๋‚˜๊ฒŒ ๋˜๋ฉด visited๊ฐ€ 2๋กœ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋˜๊ณ , ์ด๊ฒƒ์€ ์™ธ๋ถ€ ๊ณต๊ธฐ๊ฐ€ 2๋ณ€ ์ด์ƒ ์ ‘ํ•ด์žˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ๋…น์„ ๋Œ€์ƒ์ด ๋œ๋‹ค.

4. bfs๊ฐ€ ๋๋‚˜๋ฉด ๋งˆ์ง€๋ง‰์œผ๋กœ ์–ผ์Œ์„ ๋…น์—ฌ์ค€๋‹ค. ์ด์ค‘for๋ฌธ์œผ๋กœ map์„ ๋Œ๋ฉด์„œ visited๊ฐ€ 2์ด์ƒ์ธ ์ง€์ ์€ ์™ธ๋ถ€๊ณต๊ธฐ์™€ 2๋ฒˆ ์ด์ƒ ๋‹ฟ์€ ์–ผ์Œ ์ง€์ ์ผ ๊ฒƒ์ด๋ฏ€๋กœ 0์œผ๋กœ ๊ฐฑ์‹ ํ•ด์„œ ๋…น์€ ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์™ธ๋ถ€๊ณต๊ธฐ์™€ ๊ฐ™๊ฒŒ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

5. while๋ฌธ์„ ๋Œ ๋•Œ๋งˆ๋‹ค time์„ 1์”ฉ ๋Š˜๋ ค์ฃผ์–ด ๋” ์ด์ƒ ๋…น์„ ์–ผ์Œ์ด ์—†์„ ๋•Œ ๋น ์ ธ๋‚˜์˜จ๋‹ค.

 

3. ์ฝ”๋“œ

import java.util.*;
import java.io.*;


public class Main
{
    static int H, W, ans, time;
    static int[][] map, visited;
    static Queue<Pos> queue, melt_queue;
    
    static int[] dy = {-1,1,0,0};
    static int[] dx = {0,0,-1,1};

    public static void main(String args[]) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        H = Integer.parseInt(st.nextToken());
        W = Integer.parseInt(st.nextToken());
        map = new int[H][W];
        
        for (int i=0; i<H; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j=0; j<W; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        } //์ž…๋ ฅ ๋
        
        solution();
        System.out.println(ans);
    }

    static void solution() {
        while (true) {
            int cnt = 0;
            
            visited = new int[H][W];
            for (int i=0; i<H; i++) {
                for (int j = 0; j<W; j++) {
                    if (map[i][j] == 1) {
                        cnt++;
                        bfs();
                    }
                }
            }
            if (cnt == 0) {
                ans = time;
                break;
            }

            for (int i=0; i<H; i++) {
                for (int j=0; j<W; j++) {
                    if (visited[i][j] >= 2) {
                        map[i][j] = 0; //๋…น์Œ
                    }
                }
            }
            time++;
        }
    }

    static void bfs() {
        queue = new ArrayDeque<> ();
        melt_queue = new ArrayDeque<> ();

        queue.offer(new Pos(0,0));
        visited[0][0] = 1;
        while (!queue.isEmpty()) {
            Pos now = queue.poll();
            for (int d=0; d<4; d++) {
                int ny = now.y+dy[d];
                int nx = now.x+dx[d];
                if (ny<0 || ny>=H || nx<0 || nx>=W) continue;
                //check
                if (map[ny][nx] == 1) {
                    visited[ny][nx]++;
                } else if (map[ny][nx]==0 && visited[ny][nx]==0){
                    visited[ny][nx] = 1;
                    queue.offer(new Pos(ny, nx));
                }
            }
        }
    }

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

 

4. ์‚ฌ๋‹ด

์†Œํ”„ํ‹ฐ์–ด๋Š” ํšจ์œจ์„ ์ค‘์š”์‹œํ•˜๋Š” ๋Š๋‚Œ์ด๋‹ค.

๋งค์ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ‘ธ๋‹ˆ๊นŒ ์žฌ๋ฐŒ๋‹ค. ์žฌ๋ฐŒ๋Š” ๋งŒํผ ์‹ค๋ ฅ๋„ ๋นจ๋ฆฌ ๋Š˜๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค..