J

[JAVA] BOJ ๋ฐฑ์ค€ 3190 ๋ฑ€ ๋ณธ๋ฌธ

๐Ÿ”‘ Problem Solving/๐Ÿ’ป Samsung SW Expert

[JAVA] BOJ ๋ฐฑ์ค€ 3190 ๋ฑ€

snowball๐Ÿฐ 2023. 7. 7. 10:57

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

๐Ÿ“Œ ์ด ๋ฌธ์ œ์˜ ์œ ์˜์ ์€ ๋ฐ˜๋“œ์‹œ ์ •ํ•ด์ง„ ์ˆœ์„œ๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ์งœ์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๋จธ๋ฆฌ์™€ ๊ผฌ๋ฆฌ๊ฐ€ ๋™์‹œ์— ์›€์ง์ž„์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋จธ๋ฆฌ๊ฐ€ ์›€์ง์ด๊ณ ! ํ›„์— ๊ผฌ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘˜์ง€ ์ด๋™ํ• ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค

์ „์ฒด์ฝ”๋“œ

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

public class Main {
    static class timer{
        char dir;
        int time;
        timer(char dir, int time){
            this.dir = dir;
            this.time = time;
        }
    }
    static boolean[][] map;
    static boolean[][] snake;
    static int[] dx = {0, 1, 0, -1}, dy = {1, 0, -1, 0};
    public static void main(String[] args) throws Exception{
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(bf.readLine());
        map = new boolean[N][N];
        snake = new boolean[N][N];
        int K = Integer.parseInt(bf.readLine());
        for(int i=0; i<K; i++){
            StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            map[x-1][y-1] = true;
        }
        ArrayDeque<timer> q = new ArrayDeque<>();
        int L = Integer.parseInt(bf.readLine());
        for(int i=0; i<L; i++){
            StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
            int x = Integer.parseInt(st.nextToken());
            char c = st.nextToken().charAt(0);
            q.offer(new timer(c, x));
        }
        int time = 1;
        int hx = 0; int hy = 0;
        int tx = 0; int ty = 0;
        int d = 0;
        ArrayDeque<int[]> road = new ArrayDeque<>();
        while(true){
            if(!q.isEmpty() && q.peek().time < time){
                timer t = q.poll();
                if(t.dir == 'L')
                    d = (d+3) % 4;
                else if(t.dir == 'D')
                    d = (d+1) % 4;
            }
            hx += dx[d]; hy += dy[d];

            if(hx < 0 || hx >= N || hy < 0 || hy >= N) break; // ๋ฒฝ์— ๋ถ€๋”ชํžˆ๊ฑฐ๋‚˜
            if(snake[hx][hy]) break; // ์ž๊ธฐ์ž์‹ ์˜ ๋ชธ๊ณผ ๋ถ€๋”ชํž˜
            snake[hx][hy] = true;
            road.offer(new int[]{hx, hy});

            if(map[hx][hy]) map[hx][hy] = false;
            else {
                snake[tx][ty] = false;
                tx = road.peek()[0];
                ty = road.poll()[1];
            }
//            System.out.println(hx+", " +hy)
            time++;
        }
        System.out.println(time);
    }
}

ํ•œ ์ค„ ์”ฉ ๋ณด์ž!

static class timer{
    char dir;
    int time;
    timer(char dir, int time){
        this.dir = dir;
        this.time = time;
    }
}
static boolean[][] map;
static boolean[][] snake;
static int[] dx = {0, 1, 0, -1}, dy = {1, 0, -1, 0};

timer ํด๋ž˜์Šค๋Š” ์ž…๋ ฅ๋ฐ›์€ ์œ„์น˜ ๋ณ€ํ™˜ ์ •๋ณด๋ฅผ ๋ฐ›๋Š” ํด๋ž˜์Šค์ด๋‹ค.

map์€ ์‚ฌ๊ณผ์˜ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•œ๋‹ค(true์ผ ๋•Œ, ํ•ด๋‹น ์œ„์น˜์— ์‚ฌ๊ณผ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๋œป)

snake๋Š” ๋ฑ€์˜ ์œ„์น˜๋“ค์„ ์ €์žฅํ•œ๋‹ค(true์ด๋ฉด ํ•ด๋‹น ์œ„์น˜์— ๋ฑ€์ด ์กด์žฌํ•œ๋‹ค๋Š” ๋œป)

dx, dy๋กœ ๋‹ค์Œ ์œ„์น˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.

int N = Integer.parseInt(bf.readLine());
map = new boolean[N][N];
snake = new boolean[N][N];
int K = Integer.parseInt(bf.readLine());
for(int i=0; i<K; i++){
    StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
    int x = Integer.parseInt(st.nextToken());
    int y = Integer.parseInt(st.nextToken());
    map[x-1][y-1] = true;
}
ArrayDeque<timer> q = new ArrayDeque<>();
int L = Integer.parseInt(bf.readLine());
for(int i=0; i<L; i++){
    StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
    int x = Integer.parseInt(st.nextToken());
    char c = st.nextToken().charAt(0);
    q.offer(new timer(c, x));
}

์‚ฌ๊ณผ์˜ ์œ„์น˜๋ฅผ ๋ฐ›์•„์„œ map์— ์‚ฌ๊ณผ ์ •๋ณด๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.

์œ„์น˜ ๋ณ€๊ฒฝ ์ •๋ณด๋ฅผ ๋ฐ›์•„์„œ Queue์— ์ €์žฅํ•ด์ค€๋‹ค.

int time = 1;
int hx = 0; int hy = 0;
int tx = 0; int ty = 0;
int d = 0;
ArrayDeque<int[]> road = new ArrayDeque<>();
while(true){
    if(!q.isEmpty() && q.peek().time < time){
        timer t = q.poll();
        if(t.dir == 'L')
            d = (d+3) % 4;
        else if(t.dir == 'D')
            d = (d+1) % 4;
    }
    hx += dx[d]; hy += dy[d];

    if(hx < 0 || hx >= N || hy < 0 || hy >= N) break; // ๋ฒฝ์— ๋ถ€๋”ชํžˆ๊ฑฐ๋‚˜
    if(snake[hx][hy]) break; // ์ž๊ธฐ์ž์‹ ์˜ ๋ชธ๊ณผ ๋ถ€๋”ชํž˜
    snake[hx][hy] = true;
    road.offer(new int[]{hx, hy});

    if(map[hx][hy]) map[hx][hy] = false;
    else {
        snake[tx][ty] = false;
        tx = road.peek()[0];
        ty = road.poll()[1];
    }
    time++;
}
System.out.println(time);
}

time ๋ณ€์ˆ˜์— ์ง€๋‚œ ์‹œ๊ฐ„์„ ์ €์žฅํ•œ๋‹ค. hx, hy๋Š” ๋ฑ€์˜ ๋จธ๋ฆฌ ์œ„์น˜๋ฅผ tx, ty๋Š” ๋ฑ€์˜ ๊ผฌ๋ฆฌ ์œ„์น˜๋ฅผ ์ €์žฅํ•œ๋‹ค.

d์—๋Š” ์ด๋™ ๋ฐฉํ–ฅ์„ ์ €์žฅํ•œ๋‹ค.

Queue์— ๋จธ๋ฆฌ์˜ ์ด๋™ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜์—ฌ ๊ผฌ๋ฆฌ๊ฐ€ ๋”ฐ๋ผ์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

๋จผ์ € ์ด๋™ํ•ด์•ผ ๋˜๋Š” ํƒ€์ž„์— ์ด๋™ ๋ฐฉํ–ฅ์„ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

์ด๋•Œ ๋จธ๋ฆฌ๊ฐ€ ๋ฒฝ์— ๋ถ€๋”ชํžˆ๊ฑฐ๋‚˜ ๋ชธํ†ต๊ณผ ๋งŒ๋‚˜๊ฒŒ ๋˜๋ฉด ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋˜๋ฏ€๋กœ break ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

๊ทธ ๋’ค ๊ผฌ๋ฆฌ์˜ ์ด๋™์„ ์„ค์ •ํ•ด์ค€๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์‹œ๊ฐ„์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

Comments