
어렵게 생각할 필요 없었던 문제...
구현은 진짜 간단했다.
뱀을 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;
}
}