백준 [3190] 뱀

문제보기
Alt text

풀이

  • 시뮬레이션
  • 입력이 조금 지저분하다.. 스캐너로 받을걸 그랬다
  • 주의사항 : 사과의 위치가 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;
	}
}