์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[ ๋ฐฑ์ค€ / BOJ 16236 ] ์•„๊ธฐ ์ƒ์–ด ( ์ž๋ฐ”/JAVA )

KIMHYEYUN 2022. 1. 30. 20:42
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ ์„ค๋ช…

์•„๊ธฐ ์ƒ์–ด

  • ์ฒ˜์Œ ํฌ๊ธฐ : 2
  • 1์ดˆ์— ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ํ•œ ์นธ์”ฉ ์ด๋™ ๊ฐ€๋Šฅ
  • ์ž๊ธฐ๋ณด๋‹ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ณณ์€ ํ†ตํ–‰ ๋ถˆ๊ฐ€
  • ์ž๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๋งŒ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ž๊ธฐ ํฌ๊ธฐ ๋งŒํผ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋ฉด ํฌ๊ธฐ += 1

์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์–ด๋””๋กœ ์ด๋™ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ๋” ์ด์ƒ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ โŽ ๐Ÿ‘‰ ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€ ์š”์ฒญ
  • ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ 1๋งˆ๋ฆฌ ๐Ÿ‘‰ ๊ทธ ๋ฌผ๊ณ ๊ธฐ ๋จน์œผ๋กœ ๊ฐ€๊ธฐ
  • ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ 2๋งˆ๋ฆฌ ์ด์ƒ ๐Ÿ‘‰ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ ๋จน์œผ๋Ÿฌ ๊ฐ€๊ธฐ
    • ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ™์€ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์กด์žฌํ•˜๋ฉด ๐Ÿ‘‰ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ,
    • ๊ทธ๊ฒƒ๋„ ์—ฌ๋Ÿฌ ๋งˆ๋ฆฌ๋ผ๋ฉด ๐Ÿ‘‰ ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋‹ค.

๋ฌธ์ œ ํ’€์ด

1. ์ž…๋ ฅ๋ฐ›๊ธฐ

map[i][j] : ๊ณต๊ฐ„์˜ ์ƒํƒœ
sharkX, sharkY : ์•„๊ธฐ ์ƒ์–ด์˜ ์œ„์น˜

2. ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ ํƒ์ƒ‰

checkMinDist(sharkX, sharkY)

BFS์ด์šฉ
dist[x][y] ๐Ÿ‘‰ (sharkX, sharkY)๋ถ€ํ„ฐ (x,y)๊นŒ์ง€ ์ตœ์†Œ๊ฑฐ๋ฆฌ
map[x][y]์— ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์กด์žฌํ•˜๊ณ , ํฌ๊ธฐ๊ฐ€ ์•„๊ธฐ ์ƒ์–ด๋ณด๋‹ค ์ž‘์œผ๋ฉด,
๐Ÿ‘‰ (minX, minY), minDist์— (x,y), dist[x][y] ์ €์žฅ

minDist๊ฐ€ ๊ฐ™์œผ๋ฉด ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ, ๊ทธ๊ฒƒ๋„ ๊ฐ™์œผ๋ฉด ๊ฐ€์žฅ ์™ผ์ชฝ ๋ฌผ๊ณ ๊ธฐ์˜ ์œ„์น˜ ์ €์žฅ

3. ๋ฌผ๊ณ ๊ธฐ ๋จน๊ธฐ

eatFish()
๋งŒ์•ฝ (minX, minY)๊ฐ€ ์ดˆ๊ธฐ๊ฐ’์ด๋ผ๋ฉด ๋” ์ด์ƒ ๋จน์„ ๋ฌผ๊ณ ๊ธฐ ์กด์žฌโŒ ๐Ÿ‘‰ ์ข…๋ฃŒ

์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์€ ๋ฌผ๊ณ ๊ธฐ ์ˆ˜๋ฅผ ์ฆ๊ฐ€
(sharkX, sharkY)๋ฅผ (minX, minY)๋กœ ๋ณ€๊ฒฝ
๊ฑธ๋ฆฐ ์‹œ๊ฐ„ time += minDist

์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋ณธ์ธ ํฌ๊ธฐ๋งŒํผ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์—ˆ๋‹ค๋ฉด, ํฌ๊ธฐ ์ฆ๊ฐ€

์ฝ”๋“œ

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

public class Main_BOJ_16236_์•„๊ธฐ_์ƒ์–ด {

    static int N, sharkX, sharkY, minX, minY, minDist, sharkSize = 2, eating = 0, time = 0;
    static int[][] map, dist;
    static int[] dx = {-1, 0, 0, 1};
    static int[] dy = {0, -1, 1, 0};

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

        N = Integer.parseInt(br.readLine());

        map = new int[N][N];
        for (int i = 0; i < N; i++) {
            stringTokenizer = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                map[i][j] = Integer.parseInt(stringTokenizer.nextToken());
                if (map[i][j] == 9) {
                    sharkX = i;
                    sharkY = j;
                    map[i][j] = 0;
                }
            }
        }

        while(true){
            dist = new int[N][N];
            minX = Integer.MAX_VALUE;
            minY = Integer.MAX_VALUE;
            minDist = Integer.MAX_VALUE;

            checkMinDist(sharkX, sharkY);
            if(eatFish()) break;
        }
        System.out.println(time);
    }

    private static boolean eatFish() {
        if (minX != Integer.MAX_VALUE && minY != Integer.MAX_VALUE) {
            eating++;
            map[minX][minY] = 0;
            sharkX = minX;
            sharkY = minY;
            time += dist[minX][minY];

            if (eating == sharkSize) {
                sharkSize++;
                eating = 0;
            }
            return false;
        }
        return true;
    }

    private static void checkMinDist(int sharkX, int sharkY) {
        Queue<int[]> q = new LinkedList<>();
        q.offer(new int[]{sharkX, sharkY});

        while (!q.isEmpty()) {
            int[] now = q.poll();

            for (int i = 0; i < 4; i++) {
                int nx = now[0] + dx[i];
                int ny = now[1] + dy[i];

                if(nx < 0 || ny < 0 || N <= nx || N <= ny || map[nx][ny] > sharkSize || dist[nx][ny] != 0) continue;

                dist[nx][ny] = dist[now[0]][now[1]] + 1;


                if(map[nx][ny] != 0 && map[nx][ny] < sharkSize){
                    if(minDist > dist[nx][ny]){
                        minDist = dist[nx][ny];
                        minX = nx;
                        minY = ny;
                    } else if (minDist == dist[nx][ny]) {
                        if (minX == nx) {
                            minY = Math.min(minY, ny);
                        } else if (minX > nx) {
                            minX = nx;
                            minY = ny;
                        }
                    }
                }

                q.offer(new int[]{nx, ny});
            }
        }
    }
}
728x90
๋ฐ˜์‘ํ˜•