https://www.acmicpc.net/problem/3190
이 문제는 단순 구현으로 푸는 문제이다.
그래서인지 좀 더 어렵게 느껴질 수 있다.
- Deque를 사용해서 머리좌표와 꼬리좌표를 빼내고 넣는다.
- moveX, moveY의 좌표설정이 중요하다.
- 90도씩 돌아가니까 시계방향으로 오른쪽, 아래, 왼쪽, 위
- 따라서 오른쪽: 0, 아래: 1, 왼쪽: 2, 위: 3
static int[] moveX = {0, 1, 0, -1}; static int[] moveY = {1, 0, -1, 0};
- 갈려는 좌표(goX, goY)가 사과인지 먼저 파악하고 머리좌표를 Deque에 넣어준다.
if(map[goX][goY] != 2){ // 사과가 아니면 // 꼬리를 빼준다. int tailX = dqX.poll(); int tailY = dqY.poll(); map[tailX][tailY] = 0; } // 머리는 항상 가니까 넣어준다. dqX.add(goX); dqY.add(goY); map[goX][goY] = 1;
import java.util.*;
import java.io.*;
public class Main{
// 90도씩 돌아가니까 시계방향으로 오른쪽, 아래, 왼쪽, 위
// 따라서 오른쪽: 0, 아래: 1, ....
static int[] moveX = {0, 1, 0, -1};
static int[] moveY = {1, 0, -1, 0};
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int K = Integer.parseInt(br.readLine());
int[][] map = new int[N+1][N+1];
for(int i = 0; i < K; i++){
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
map[x][y] = 2; // 2: 사과
}
ArrayList<Direction> dirList = new ArrayList<>();
int L = Integer.parseInt(br.readLine());
for(int i = 0; i < L; i++){
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int X = Integer.parseInt(st.nextToken());
String C = st.nextToken();
dirList.add(new Direction(X, C));
}
Deque<Integer> dqX = new ArrayDeque<Integer>();
Deque<Integer> dqY = new ArrayDeque<Integer>();
int time = 0;
int direction = 0; //오른쪽 먼저
dqX.add(1);
dqY.add(1);
map[1][1] = 1; // 1: 뱀
//while(!dqX.isEmpty()){
while(true){
time++;
// peekLast: Queue에서 맨 나중에 들어간 원소. = 머리부분
int goX = (int)dqX.peekLast() + moveX[direction];
int goY = (int)dqY.peekLast() + moveY[direction];
// 범위에 벗어나거나, 뱀이 있는 위치라면(map[][] == 1)
if(goX <= 0 || goY <= 0 || goX > N || goY > N || map[goX][goY] == 1){
break;
}
if(map[goX][goY] != 2){ // 사과가 아니면
// 꼬리를 빼준다.
int tailX = dqX.poll();
int tailY = dqY.poll();
map[tailX][tailY] = 0;
}
// 머리는 항상 가니까 넣어준다.
dqX.add(goX);
dqY.add(goY);
map[goX][goY] = 1;
if(!dirList.isEmpty()){
if(time == dirList.get(0).time){
String dirS = dirList.get(0).dir;
dirList.remove(0);
if(dirS.equals("D")){
direction += 1;
if(direction > 3){
direction = 0;
}
} else {
direction -= 1;
if(direction < 0){
direction = 3;
}
}
}
}
}
System.out.println(time);
}
public static class Direction{
int time;
String dir;
public Direction(int time, String dir){
this.time = time;
this.dir = dir;
}
}
}