백준 3190 뱀 JAVA

sundays·2023년 5월 11일
0

문제

풀이

이 문제는 덱을 사용하면 이문제에서 주어진 뱀의 성질을 잘 이용할 수 있다. 사과를 만나면 길이가 사과 개수만큼 길어지는 것이기 때문이다.

map이라는 배열을 정의 해주어서 값이 2이면 현자 뱀의 몸에 해당하고 1은 사과를 나타내도록 설계하였다

  1. 뱀의 몸을 설계 해준다
int x = 0, y = 0;
// 뱀의 몸
Deque<int[][]> dq = new LinkedList<>(); 
dq.add(new int[] {x, y});
map[x][y] = 2; // 현재 뱀의 위치
  1. 먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치시킨다.
static int[] dx = {1, 0, -1, 0}; // 동, 북, 서, 남
static int[] dy = {0, 1, 0, -1};
    
...
int nx = x + dx[direction];
int ny = y + dy[direction];
  1. 만약 벽이나 자기자신의 몸과 부딪히면 게임이 끝난다.
if (nx < 0 || ny < 0 || nx >= n || ny >= n || map[nx][ny] == 2) {
	break;
}
  1. 만약 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다.
// 칸에 사과가 있을때
if (map[nx][ny] == 1) {
	// 뱀이 위치 한다
	map[nx][ny] = 2;
    
    // 뱀의 머리를 변경한다
    dq.addFirst(new int[] {nx, ny});
}
  1. 만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다. 즉, 몸길이는 변하지 않는다.
// 칸이 비었을때
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});
}
  1. 방향을 변경해준다
// 방향 변경 할 수 있는 것이 존재 한다
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;
        }
    }
}

구현문제는 어렵다. 구현 문제만 몇 주째 풀고 있는데 진짜 실력이 잘 않 느는 느낌이다. 어떤 자료 구조를 쓰면 더 유용할지 생각하는 버릇도 중요하다.

내가 이문제에서 가장 애먹은것은 오타 인데 문제가 풀면 풀수록 확실히 오타는 줄어들긴 하는데 여전히 심각해서 구현문제는 특히나 구조가 복잡하기 때문에 잡아내기가 쉽지 않았던 것 같다.

전체 코드

전체 코드

profile
develop life

0개의 댓글