본문 바로가기

Algorithm/문제

[백준 / JAVA] 3190. 뱀 (G4)

https://www.acmicpc.net/problem/3190

 

3190번: 뱀

'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

 

스네이크 게임을 직접 구현해 본 입장으로서 쉬울 줄 알았지만 매우 오래 삽질을 하였다. 두 가지 헤맨 포인트가 있는데 첫 번째 포인트는 뱀의 방향 전환 정보 X와 C에서 X가 게임 전체 시간이다. 예를 들어 8D, 10D 라면 8초 진행한 후 꺾고 2초 후 다시 꺾는다.(나는 8초 후, 10초 후라고 생각함) 두 번째 포인트는 보통의 뱀 게임과 달리 여기서는 머리가 먼저 움직인다! 무슨 뜻이냐면 내가 이동으로 인해 꼬리가 사라질 위치에 미리 머리를 위치하면 꼬리를 밟은 판정이 된다. 그래서 뱀 게임의 고급 기술인 원형을 유지하고 빙글빙글 도는 게 불가능하다.(국룰 위반이라 생각함)

 

숏코딩 하려다 틀렸다

 

import java.util.*;
import java.io.*;

public class Main {
	static BufferedReader br;
	static StringTokenizer st;
	static StringBuilder sb;

	public static void main(String[] args) throws Exception {
		br = new BufferedReader(new InputStreamReader(System.in));
		sb = new StringBuilder();
		N = Integer.parseInt(br.readLine());
		map = new int[N][N];
		K = Integer.parseInt(br.readLine());
		dq = new ArrayDeque<>();
		dq.add(new Point(0, 0));
		map[0][0] = 2;
		for (int i = 0; i < K; i++) {
			st = new StringTokenizer(br.readLine());
			int row = Integer.parseInt(st.nextToken()) - 1;
			int col = Integer.parseInt(st.nextToken()) - 1;
			map[row][col] = 1;
		}
		int l = Integer.parseInt(br.readLine());
		for (int i = 0; i < l; i++) {
			st = new StringTokenizer(br.readLine());
			int dist = Integer.parseInt(st.nextToken()) - time;
			for (int j = 0; j < dist; j++) {
				time++;
				if (!move()) {
					System.out.println(time);
					return;
				}
			}
			if (st.nextToken().equals("D"))
				dest = (dest + 1) % 4;
			else {
				if (dest == 0)
					dest = 3;
				else
					dest = (dest - 1) % 4;
			}
		}
		while(true) {
			time++;
			if(!move()) {
				System.out.println(time);
				return;
			}
		}
	}

	static int N, K, map[][], time = 0, dest = 1, dr[] = { -1, 0, 1, 0 }, dc[] = { 0, 1, 0, -1 };
	static Point head, tail;
	static Deque<Point> dq;

	static boolean move() {
		head = dq.peek();
		int hr = head.row + dr[dest];
		int hc = head.col + dc[dest];
		if (hr < 0 || hr >= N || hc < 0 || hc >= N) // 벽
			return false;
		if (map[hr][hc] != 1) {
			if (map[hr][hc] == 2)
				return false;
			tail = dq.pollLast();
			map[tail.row][tail.col] = 0;
		}
		map[hr][hc] = 2;
		dq.addFirst(new Point(hr, hc));
		return true;
	}

	static class Point {
		int row, col;

		public Point(int row, int col) {
			super();
			this.row = row;
			this.col = col;
		}
	}
}