Java

[백준 3190] 뱀 (JAVA)

iheeeee6-6 2023. 6. 6. 23:56
728x90

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

 

3190번: 뱀

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

www.acmicpc.net

 

 

오타로 인해 시간이 오래걸렸던 문제였다...ㅠㅠㅠㅠ

오타 정말 조심하자....

 

<풀이>

map은 전체적인 영역을 나타내는 것으로,

사과 있는 곳은 1

뱀의 위치는 2

빈칸은 0이다.

 

prevDir은 뱀이 이동한 방향을 넣어준다. 

큐를 사용해서 선입선출로, 

사과가 없는 영역으로 갈 경우에 prevDir을 poll하여 꼬리를 이동시킨다.

 

dx,dy는 방향을 나타내는 배열로,

순서대로 오른쪽, 아래쪽, 왼쪽, 위쪽 이렇게 들어있다.

따라서 첫 시작은 오른쪽 방향이므로 인덱스는 0이고,

'L' 이 들어올 경우 왼쪽으로 90도 회전- > 기존 인덱스 -1

'D' 이 들어올 경우 오른쪽으로 90도 회전- > 기존 인덱스 +1

방향의 값이 -1일 경우에는 3으로 세팅, 4일 경우에는 0으로 세팅한다.

 

 

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[][] map; // 사과 있는 곳은 1
	static int[] dirTime; // -1이 왼, +1이 오
	static Queue<Integer> prevDir; // -1이 왼, +1이 오
	static int answer = 1;
	static int n, k;
	static int nowDir = 0;
	static int[] dx = { 0, 1, 0, -1 };
	static int[] dy = { 1, 0, -1, 0 };

	static int nowX = 1, nowY = 1, nowSize = 1, endX = 1, endY = 1;

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		k = Integer.parseInt(br.readLine());

		map = new int[n + 1][n + 1];
		StringTokenizer st;
		for (int i = 0; i < k; i++) {
			st = new StringTokenizer(br.readLine());
			map[Integer.parseInt(st.nextToken())][Integer.parseInt(st.nextToken())] = 1;
		}
		int l = Integer.parseInt(br.readLine());
		dirTime = new int[10001];
		prevDir= new LinkedList<>();
		for (int i = 0; i < l; i++) {
			st = new StringTokenizer(br.readLine());
			int x = Integer.parseInt(st.nextToken());
			char dir = st.nextToken().charAt(0);
			dirTime[x] = dir == 'L' ? -1 : 1;
		}

		map[1][1] = 2;
		move();
		System.out.println(answer);
	}

	static void move() {
		while (true) {
			prevDir.add(nowDir);
			nowX += dx[nowDir];
			nowY += dy[nowDir];

			if (nowX <= 0||nowY<=0||nowX>n||nowY>n || map[nowX][nowY] == 2)
				return;
			if (map[nowX][nowY] == 1) {
				nowSize++;
			} else {
				map[endX][endY] = 0;
				int prev= prevDir.poll();
				endX += dx[prev];
				endY += dy[prev];
			}
			map[nowX][nowY] = 2;

			if (dirTime[answer] == -1 || dirTime[answer] == 1) {
				nowDir += dirTime[answer];
				if(nowDir==-1) nowDir=3;
				else if(nowDir==4) nowDir=0;
			}

			answer++;
		}
	}

}