[백준/Java] 3190 뱀

ynco·2025년 7월 2일

백준

목록 보기
20/21

어렵게 생각할 필요 없었던 문제...
구현은 진짜 간단했다.
뱀을 queue 로 구현하는 아이디어 생각하기가 까다로웠음

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int N;
    static int[][] map;

    // 오 하 좌 상
    static int[] dr = {0, 1, 0, -1};
    static int[] dc = {1, 0, -1, 0};
    static int K, L;
    static Queue<int[]> snake = new LinkedList<>();

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


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

        map = new int[N][N];
        StringTokenizer st;

        for (int i = 0; i < K; i++) {
            st = new StringTokenizer(br.readLine());
            int row = Integer.parseInt(st.nextToken()) - 1;
            int col = Integer.parseInt(st.nextToken()) - 1;
            map[row][col] = 1;
        }

        L = Integer.parseInt(br.readLine());
        char[] direction = new char[L];
        int[] directionT = new int[L];


        for (int i = 0; i < L; i++) {
            st = new StringTokenizer(br.readLine());
            directionT[i] = Integer.parseInt(st.nextToken());
            direction[i] = st.nextToken().charAt(0);
        }

        int time = 0;

        int snakeR = 0;
        int snakeC = 0;
        snake = new LinkedList<>();
        int idx = 0;
        int d = 0;

        snake.offer(new int[]{0, 0});

        while (true) {
            time++;

            snakeR += dr[d];
            snakeC += dc[d];

            if (isFinished(snakeR, snakeC)) break;

            if (map[snakeR][snakeC] == 1) {
                snake.offer(new int[]{snakeR, snakeC});
                map[snakeR][snakeC] = 0;
            } else {
                snake.offer(new int[]{snakeR, snakeC});
                snake.poll();
            }

            // 방향 바꿔야 할 때
            if (idx < L && directionT[idx] == time) {
                if (direction[idx] == 'D') {
                    d++;
                    if (d >= 4) d -= 4;
                } else if (direction[idx] == 'L') {
                    d--;
                    if (d < 0) d += 4;
                }
                idx++;
            }

        }

        System.out.println(time);

    }

    static boolean isFinished(int nx, int ny) {
        // 벽이랑 닿으면 종료
        if (nx >= N || ny >= N || nx < 0 || ny < 0) return true;

        // 몸이랑 닿으면 종료
        List<int[]> tempSnake = new ArrayList<>(snake);
        for (int i = 0; i < snake.size(); i++) {
            int[] temp = tempSnake.get(i);
//            System.out.println(Arrays.toString(temp));
            if (nx == temp[0] && ny == temp[1]) return true;
        }
        return false;
    }
}

0개의 댓글