-
Notifications
You must be signed in to change notification settings - Fork 6
/
seonghun.java
108 lines (86 loc) · 2.03 KB
/
seonghun.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public class seonghun {
static int time;
static int N, K, L;
static int[] X;
static char[] C;
static int[][] map; // 0(공백), 1(뱀), 2(사과)
static int[][] direct = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; // 방향
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// initialize
time = 0;
N = input.nextInt();
map = new int[N][N];
map[0][0] = 1;
K = input.nextInt();
for (int i = 0; i < K; i++) {
map[input.nextInt() - 1][input.nextInt() - 1] = 2; // 사과 표시
}
L = input.nextInt();
X = new int[L + 1];
C = new char[L];
for (int i = 0; i < L; i++) {
X[i] = input.nextInt();
C[i] = input.next().charAt(0);
}
X[L] = 10000;
// solution
int hx = 0, hy = 0; // 머리의 위치
int dir = 0; // 머리의 방향
boolean crash = false; // 충돌 여부
Queue<Point> snake = new LinkedList<>(); // 뱀이 위치한 좌표들을 저장
snake.offer(new Point(0, 0));
for (int i = 0; i < L + 1; i++) {
// 앞으로 이동
while (time < X[i]) {
// 시간 증가
time++;
int dx = hx + direct[dir][0];
int dy = hy + direct[dir][1];
// 벽 또는 자기 몸에 충돌하는 경우
if (!inRange(dx, dy) || map[dx][dy] == 1) {
crash = true;
break;
}
// 꼬리 이동
if (map[dx][dy] != 2) {
map[snake.peek().x][snake.peek().y] = 0;
snake.remove();
}
// 머리 이동
hx = dx;
hy = dy;
map[hx][hy] = 1;
snake.add(new Point(hx, hy));
}
// 방향 전환
if (i < L) {
if (C[i] == 'L') {
dir = (dir + 3) % 4;
} else if (C[i] == 'D') {
dir = (dir + 1) % 4;
}
}
// 충돌시 게임 종료
if (crash) {
break;
}
}
// result
System.out.println(time);
}
private static boolean inRange(int x, int y) {
return 0 <= x && x < N && 0 <= y && y < N;
}
}