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++;
}
}
}