ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

Algorithm/Baekjoon

[Java] ๋ฐฑ์ค€ 19237๋ฒˆ - ์–ด๋ฅธ ์ƒ์–ด

๊ฐœ๋ฐœ๊ฐœ๊ตด๐Ÿธ 2022. 5. 29. 19:20

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

 

19237๋ฒˆ: ์–ด๋ฅธ ์ƒ์–ด

์ฒซ ์ค„์—๋Š” N, M, k๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤ 20, 2 ≤ M ≤ N2, 1 ≤ k ≤ 1,000) ๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ๊ฒฉ์ž์˜ ๋ชจ์Šต์ด ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ์นธ์ด๊ณ , 0์ด ์•„๋‹Œ ์ˆ˜ x๋Š” x๋ฒˆ ์ƒ์–ด๊ฐ€ ๋“ค์–ด์žˆ๋Š” ์นธ์„ ์˜๋ฏธ

www.acmicpc.net

----------------------------------------------------------------------------------------------------------------------

[๋ฌธ์ œ ํ’€์ด]

 

๋ฌธ์ œ๊ฐ€ ์—„์ฒญ ๊ธธ์–ด์„œ ๋ณต์žกํ• ์ค„ ์•Œ์•˜๋Š”๋ฐ, ์ฐจ๊ทผ์ฐจ๊ทผ ์ฝ์–ด๋ณด๋‹ˆ ๋‹จ์ˆœ ๊ตฌํ˜„์ด๋ผ ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค.

- start[]์— ๊ฐ ์ƒ์–ด์˜ ์‹œ์ž‘ ๋ฐฉํ–ฅ์„ ์ €์žฅ

- priority[][][] ๋ฐฐ์—ด์— ์ƒ์–ด๋“ค์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ €์žฅ

- shark[] ์ƒ์–ด๋“ค์˜ ํ˜„์žฌ ์œ„์น˜ ์ €์žฅ ๋ฐฐ์—ด

- sharkNum[][] ํ•ด๋‹น ์œ„์น˜์— ๋ƒ„์ƒˆ๋ฅผ ๋ฟŒ๋ ค๋‘” ์ƒ์–ด ์ €์žฅ

- timeLeft[][] ๋ƒ„์ƒˆ๊ฐ€ ์‚ฌ๋ผ์ง€๊ธฐ๊นŒ์ง€ ๋‚จ์€ ์‹œ๊ฐ„

์˜ˆ์ œ 1๋ฒˆ์„ ์œ„์˜ ๋ฐฐ์—ด๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ดํŽด๋ณด์ž๋ฉด, ์šฐ์„  4๊ฐœ์˜ ์ƒ์–ด์˜ ์‹œ์ž‘์œ„์น˜๋ฅผ  shark[]์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ฒ˜์Œ ์œ„์น˜๋œ ์ƒ์–ด๋“ค์€ ๋ƒ„์ƒˆ๊ฐ€ 4์ดˆ๋™์•ˆ ์œ ์ง€๋˜๋ฏ€๋กœ, ์ƒ์–ด (i,j) ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๊ณ , ๋‚จ์€์‹œ๊ฐ„์€ 4๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ค๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ƒ์–ด์˜ ํ˜„์žฌ ๋ฐฉํ–ฅ๊ณผ, ๋ฐฉํ–ฅ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

 

- move()

4๊ฐœ์˜ ์ƒ์–ด๋“ค์ด ์›€์ง์ผ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ƒ„์ƒˆ๊ฐ€ ์—†๋Š” ์žฅ์†Œ๊ฐ€ ์—†๋‹ค๋ฉด, ๊ฐ€๊นŒ์šด ์ž์‹ ์˜ ๋ƒ„์ƒˆ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

1, 2, 3, 4 ์ˆœ์„œ๋กœ ์ด๋™์„ ํ•˜๋˜ ๋„์ค‘, ํ•ด๋‹น ์œ„์น˜์— ์ด๋ฏธ ์ด๋™๋œ ์ƒ์–ด๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด์ „์— ์ด๋™๋๋˜ ์ƒ์–ด์—๊ฒŒ ์žก์•„๋จนํž™๋‹ˆ๋‹ค.

( 1~4์ˆœ์œผ๋กœ ์ด๋™์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ ๋“ค์–ด์˜ค๋Š” ์ƒ์–ด๋Š” ์ด์ „์ƒ์–ด๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์„ ์ˆ˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค. )

 

- nextTime()

์ƒ์–ด๋ฅผ ์ด๋™์‹œํ‚จ ํ›„, ์ƒ์–ด๋“ค์˜ ๋ƒ„์ƒˆ์˜ ๋‚จ์€์‹œ๊ฐ„์„ ๊ฐฑ์‹ ํ•˜์—ฌ ์ค๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ์ž‘์—…๋“ค์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ 1๋ฒˆ ์ƒ์–ด๋งŒ ๋‚จ์€ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

[์ •๋‹ต ์ฝ”๋“œ]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

class Shark {
    int x;
    int y;
    Shark(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
// 1, 2, 3, 4๋Š” ๊ฐ๊ฐ ์œ„, ์•„๋ž˜, ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ
public class Main {
    public static int N; // N*N ๋ณด๋“œ
    public static int M; // M๊ฐœ์˜ ์ƒ์–ด
    public static int k; // K๋ฒˆ ์ด๋™!
    public static int start[]; // ๊ฐ ์ƒ์–ด์˜ ์‹œ์ž‘ ๋ฐฉํ–ฅ
    public static int priority[][][];
    public static int dx[] = {0, -1, 1, 0, 0};
    public static int dy[] = {0, 0, 0, -1, 1};
    public static Shark shark[]; // ์ƒ์–ด๋“ค์˜ ์œ„์น˜
    public static int sharkNum[][]; // ๋ƒ„์ƒˆ ๋ฟŒ๋ฆฐ ์ƒ์–ด
    public static int timeLeft[][]; // ๋‚จ์€ ์‹œ๊ฐ„
    public static int time = 0;
    public static int cnt = 0;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());
        cnt = M;
        start = new int[M + 1];
        shark = new Shark[M + 1];
        priority = new int[M + 1][5][5];
        sharkNum = new int[N][N];
        timeLeft = new int[N][N];
        for(int i=0;i<N;i++) {
            st = new StringTokenizer(br.readLine());
            for(int j=0;j<N;j++) {
                int num = Integer.parseInt(st.nextToken());
                if(num > 0) {
                    shark[num] = new Shark(i,j);
                    sharkNum[i][j] = num;
                    timeLeft[i][j] = k;
                }
            }
        }
        st = new StringTokenizer(br.readLine());
        for(int i=1;i<=M;i++) {
            start[i] = Integer.parseInt(st.nextToken());
        }
        // M๊ฐœ์˜ ์ƒ์–ด ์šฐ์„ ์ˆœ์œ„ ๋‹ค ๋„ฃ์Œ
        for(int i=1;i<=M;i++) {
            for(int j=1;j<=4;j++) {
                st = new StringTokenizer(br.readLine());
                for(int k=1;k<=4;k++) {
                    priority[i][j][k] = Integer.parseInt(st.nextToken());
                }
            }
        }
        while(time < 1000) {
            move(); // 4๊ฐœ์˜ ์ƒ์–ด๋ฅผ ์ด๋™์‹œํ‚ด
            nextTime();
            time++;
            if(cnt == 1) {
                System.out.println(time);
                System.exit(0);
            }
        }
        System.out.println(-1);
    }
    public static void move() {
        // 4๊ฐœ์˜ ์ƒ์–ด๋ฅผ ์ด๋™์‹œํ‚ด
        for(int i=1;i<=M;i++) {
            // i๋ฒˆ์งธ ์ƒ์–ด ์ด๋™
            boolean isFind = false;
            if(shark[i] != null) {
                int now = start[i]; // ํ˜„์žฌ ์ƒ์–ด๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ
                for(int j=1;j<=4;j++) {
                    int next = priority[i][now][j];
                    int nextX = shark[i].x + dx[next];
                    int nextY = shark[i].y + dy[next];
                    if(!checkOut(nextX, nextY) && sharkNum[nextX][nextY] == 0) {
                        // ๊ฒน์น˜๋Š” ์ƒ์–ด ์ฃฝ์ด๊ธฐ
                        if(outShark(i, nextX, nextY)) {
                            shark[i] = null;
                            cnt--;
                        } else {
                            start[i] = next;
                            shark[i] = new Shark(nextX, nextY);
                        }
                        isFind = true;
                        break;
                    }
                }
                // ์ž์‹ ์ด ๋ƒ„์ƒˆ ๋ฟŒ๋ฆฐ ๊ณณ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
                if(!isFind) {
                    for(int j=1;j<=4;j++) {
                        int next = priority[i][now][j];
                        int nextX = shark[i].x + dx[next];
                        int nextY = shark[i].y + dy[next];
                        if(!checkOut(nextX, nextY) && sharkNum[nextX][nextY] == i) {
                            start[i] = next;
                            shark[i] = new Shark(nextX, nextY);
                            break;
                        }
                    }
                }
            }
        }
    }
    public static boolean checkOut(int x, int y) {
        if(x < 0 || x >= N || y < 0 || y >= N) {
            return true;
        }
        return false;
    }
    public static void nextTime() {
        for(int i=0;i<N;i++) {
            for(int j=0;j<N;j++) {
                if(timeLeft[i][j] == 1) {
                    timeLeft[i][j] = 0;
                    sharkNum[i][j] = 0;
                }
                if(timeLeft[i][j] > 1) {
                    timeLeft[i][j] = timeLeft[i][j] - 1;
                }
            }
        }
        for(int i=1;i<=M;i++) {
            if(shark[i] == null) {
                continue;
            }
            int x = shark[i].x;
            int y = shark[i].y;
            sharkNum[x][y] = i;
            timeLeft[x][y] = k;
        }
    }
    public static boolean outShark(int num, int x, int y) {
        for(int i=1;i<num;i++) {
            if(shark[i] != null && shark[i].x == x && shark[i].y == y) {
                return true;
            }
        }
        return false;
    }
}