백준 [3190] 뱀
문제보기
풀이
- 시뮬레이션
- 입력이 조금 지저분하다.. 스캐너로 받을걸 그랬다
- 주의사항 : 사과의 위치가 0,0 기준이 아닌 1,1이다. (0,0 기준으로 하면 컴파일 에러남)
- function() : dir(머리방향) 기준으로 진행하고, 사과의 유무에 따라서 꼬리처리. 꼬리처리는 queue 사용
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int N, K, L, ans;
static int[][] map;
static int[][] direction;
static Queue<int[][]> snake;
static int[] dx = { -1, 1, 0, 0 };
static int[] dy = { 0, 0, -1, 1 };
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
K = Integer.parseInt(br.readLine());
map = new int[N][N];
map[0][0] = 2;
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
map[r - 1][c - 1] = 1;
}
L = Integer.parseInt(br.readLine());
direction = new int[L][2];
for (int i = 0; i < L; i++) {
st = new StringTokenizer(br.readLine());
int sec = Integer.parseInt(st.nextToken());
direction[i][0] = sec;
String str = st.nextToken();
if (str.equals("L")) {
direction[i][1] = 0;
} else {
direction[i][1] = 1;
}
}
ans = 0;
snake = new LinkedList<>();
snake.add(new int[][] { { 0, 0 } });
function(0, 0, 0, 0, 3);
System.out.println(ans);
}
// 머리방향 dir: 0(상), 1(하), 2(좌), 3(우)
public static void function(int r, int c, int sec, int idx, int dir) {
sec++;
int x = r + dx[dir];
int y = c + dy[dir];
if (!isRange(x, y) || map[x][y] == 2) {
ans = sec;
return;
}
if (map[x][y] == 0 && snake.size() > 0) {
int[][] tail = snake.poll();
map[tail[0][0]][tail[0][1]] = 0;
}
snake.add(new int[][] { { x, y } });
map[x][y] = 2;
r = x;
c = y;
if (idx < L && direction[idx][0] == sec) {
int d = direction[idx][1];
switch (dir) {
case 0:
if (d == 0)
dir = 2;
else
dir = 3;
break;
case 1:
if (d == 0)
dir = 3;
else
dir = 2;
break;
case 2:
if (d == 0)
dir = 1;
else
dir = 0;
break;
case 3:
if (d == 0)
dir = 0;
else
dir = 1;
break;
}
idx++;
}
function(r, c, sec, idx, dir);
}
public static boolean isRange(int x, int y) {
return x >= 0 && y >= 0 && x < N && y < N;
}
}