문제 원본 : 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 |