본문 바로가기

Algo/백준

3190: 뱀 (구현)

풀이

보드의 크기만큼 2차원 int배열을 만들어주고 먼저 사과의 좌표값들을 큐에 모두 넣어준다.

또 초를 담을 1차원 int 배열 하나와 그에 따라 명령어를 담아둘 1차원 char 배열을 하나 만들어 명령어를 다 넣어두었다. (스터디 후에 생각해보건대 class개념으로 대체하면 더 편할 것 같다.)

도착지점은 끝 모서리로 1로 표시해두었다. 이후 0, 0에서 시작하여 체크하며 지나가는데 해당 시간이 지나면 명령어를 받아 방향을 틀어주게 하였다.

또한 사과를 먹을때 뱀의 길이가 늘어나는 걸 이용하기 위해 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 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		int K = Integer.parseInt(br.readLine());
		int[][] board = new int[N][N];
		StringTokenizer st;
		
		for (int k = 0; k < K; k++) {
			st = new StringTokenizer(br.readLine());
			int x = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());
			board[x - 1][y - 1] = 1;
		}
		
		int L = Integer.parseInt(br.readLine());
		int[] X = new int[L];
		char[] C = new char[L];
		for (int l = 0; l < L; l++) {
			st = new StringTokenizer(br.readLine());
			X[l] = Integer.parseInt(st.nextToken());
			C[l] = st.nextToken().charAt(0);
		}

		int sx = 0;
		int sy = 0;
		int v = 0;
		int cnt = 0;
		int idx = 0;
		int[] dx = { 0, 1, 0, -1 }; // 우하상좌
		int[] dy = { 1, 0, -1, 0 };
		Queue<Integer> queue = new LinkedList<Integer>();

		board[sx][sy] = 2;
		queue.offer(sx);
		queue.offer(sy);
		while (true) {
			int nx = sx + dx[v];
			int ny = sy + dy[v];
			if (nx >= 0 && ny >= 0 && nx < N && ny < N && board[nx][ny] != 2) {
				if (board[nx][ny] != 1) {
					int fx = queue.poll();
					int fy = queue.poll();
					board[fx][fy] = 0;
				}
				board[nx][ny] = 2;
				queue.offer(nx);
				queue.offer(ny);

				sx = nx;
				sy = ny;
				cnt++;
				if (idx != L && cnt == X[idx]) {
					if (C[idx] == 'D') {
						v++;
						if (v >= 4) // 0,1,2,3
							v = 0;
					} else if (C[idx] == 'L') {
						v--;
						if (v < 0) // 0,1,2,3
							v = 3;
					}
					if (idx < L) // 인덱스 넘어가는거 방지
						idx++;
				}
			} else {
				break;
			}
		}
		System.out.println(++cnt);
	}
}

'Algo > 백준' 카테고리의 다른 글

4963: 섬의 개수 (그래프)  (0) 2021.02.19
2573: 빙산 (구현)  (0) 2021.02.19
2564: 경비원 (구현)  (0) 2021.02.19
8911: 거북이 (구현)  (0) 2021.02.19
11060: 점프점프 (DP) - 실패  (0) 2021.02.19