이 문제는 덱을 사용하면 이문제에서 주어진 뱀의 성질을 잘 이용할 수 있다. 사과를 만나면 길이가 사과 개수만큼 길어지는 것이기 때문이다.
map이라는 배열을 정의 해주어서 값이 2이면 현자 뱀의 몸에 해당하고 1은 사과를 나타내도록 설계하였다
int x = 0, y = 0;
// 뱀의 몸
Deque<int[][]> dq = new LinkedList<>();
dq.add(new int[] {x, y});
map[x][y] = 2; // 현재 뱀의 위치
static int[] dx = {1, 0, -1, 0}; // 동, 북, 서, 남
static int[] dy = {0, 1, 0, -1};
...
int nx = x + dx[direction];
int ny = y + dy[direction];
if (nx < 0 || ny < 0 || nx >= n || ny >= n || map[nx][ny] == 2) {
break;
}
// 칸에 사과가 있을때
if (map[nx][ny] == 1) {
// 뱀이 위치 한다
map[nx][ny] = 2;
// 뱀의 머리를 변경한다
dq.addFirst(new int[] {nx, ny});
}
// 칸이 비었을때
if (map[nx][ny] == 0) {
// 뱀의 몸을 위치한다
map[nx][ny] = 2;
// 뱀의 꼬리를 비워준다
int[] tail = dq.pollLast();
map[tail[0]][tail[1]] = 0;
// 뱀의 머리를 변경한다
dq.addFirst(new int[] {nx, ny});
}
// 방향 변경 할 수 있는 것이 존재 한다
if (!v.isEmpty()) {
// 현재 초와 변경 시간이 동일하면 방향을 변경해준다
if (count == v.peekFirst().seconds) {
Dummy d = v.poll();
if (d.direction.equals("D")) {
direction = (direction + 3) % 4;
} else {
direction = (direction + 1) % 4;
}
}
}
구현문제는 어렵다. 구현 문제만 몇 주째 풀고 있는데 진짜 실력이 잘 않 느는 느낌이다. 어떤 자료 구조를 쓰면 더 유용할지 생각하는 버릇도 중요하다.
내가 이문제에서 가장 애먹은것은 오타 인데 문제가 풀면 풀수록 확실히 오타는 줄어들긴 하는데 여전히 심각해서 구현문제는 특히나 구조가 복잡하기 때문에 잡아내기가 쉽지 않았던 것 같다.