728x90
https://www.acmicpc.net/problem/3190
오타로 인해 시간이 오래걸렸던 문제였다...ㅠㅠㅠㅠ
오타 정말 조심하자....
<풀이>
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++;
}
}
}
'Java' 카테고리의 다른 글
[백준 23288] 주사위 굴리기2 (JAVA) (2) | 2023.06.08 |
---|---|
[백준 14499] 주사위 굴리기 (JAVA) (0) | 2023.06.07 |
[백준 16234] 인구 이동 (JAVA) (0) | 2023.06.02 |
[백준 12845] 모두의 마블 (JAVA) (0) | 2023.06.01 |
[백준 2110] 공유기 설치 (JAVA) (0) | 2023.06.01 |