알고리즘/BOJ

[BOJ] 3190. 뱀

재담 2022. 3. 1. 18:17

문제 원본 : https://www.acmicpc.net/problem/3190

 

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

import java.io.*;
import java.util.ArrayDeque;
import java.util.Deque;

public class Main {
    static int[][] dir = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

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

        int n = Integer.parseInt(br.readLine());
        int k = Integer.parseInt(br.readLine());

        int[][] board = new int[n][n];

        for (int i = 0; i < k; ++i) {
            String[] apple = br.readLine().split(" ");
            board[Integer.parseInt(apple[0]) - 1][Integer.parseInt(apple[1]) - 1] = 1;
        }

        Deque<Pos> deque = new ArrayDeque<>();
        deque.addFirst(new Pos(0, 0));
        board[0][0] = 2;
        int d = 1;
        int ans = 0;
        boolean isFinished = false;
        int l = Integer.parseInt(br.readLine());
        for (int i = 0; i < l; ++i) {
            String[] cmd = br.readLine().split(" ");

            while (!isFinished) {
                ++ans;

                int nr = deque.getFirst().r + dir[d][0];
                int nc = deque.getFirst().c + dir[d][1];

                if (nr < 0 || nc < 0 || nr >= n || nc >= n || board[nr][nc] == 2) {
                    isFinished = true;
                    break;
                }

                deque.addFirst(new Pos(nr, nc));

                if (board[nr][nc] != 1) {
                    board[deque.getLast().r][deque.getLast().c] = 0;
                    deque.removeLast();
                }

                board[nr][nc] = 2;

                if (ans == Integer.parseInt(cmd[0])) {
                    if (cmd[1].equals("D")) {
                        d = (d + 1) % 4;
                    } else {
                        d = (d + 3) % 4;
                    }
                    if (i != l - 1) {
                        break;
                    }
                }
            }
        }

        bw.write(Integer.toString(ans));

        bw.close();
        br.close();
    }

    public static class Pos {
        public int r;
        public int c;

        public Pos(int r, int c) {
            this.r = r;
            this.c = c;
        }
    }
}
  • 구현 문제
  • Deque를 이용해 머리 좌표를 first에 넣고, 사과를 먹으면 last를 빼지 않는다.
  • 상위 호환인 문제가 있는데 많이 어려워 보인다.

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ] 2252. 줄 세우기  (0) 2022.03.05
[BOJ] 5430. AC  (0) 2022.03.02
[BOJ] 1074. Z  (0) 2022.02.28
[BOJ] 1600. 말이 되고픈 원숭이  (0) 2022.02.27
[BOJ] 2206. 벽 부수고 이동하기  (0) 2022.02.27