[Java] 백준 3190번 뱀
2022. 4. 17. 18:38
728x90
https://www.acmicpc.net/problem/3190
3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
이번 문제는 시뮬레이션입니다. 저는 dfs 처럼 풀었고 시뮬은 풀때마다 생각하는 것인데 문제를 잘 읽어야합니다.
시뮬만 풀면 저는 머리가 왜이렇게 새하얘지는지 .... 더 공부해야할듯합니다.
조금 주의할 부분은 방향입니다.
저는 우 하 좌 상 순으로 dx, dy 배열을 만들었고
nowDir을 0,1,2,3 순으로 D와 L에 반응하게 만들었습니다.
다시 말해 D가 나오면 nowDir을 ++ 시켜주고 L이 나오면 --시켜 줍니다.
만약 nowDir이 -1이나 4가 될 경우 nowDir을 3, 0으로 변환 시켜주었습니다.
자세한 부분은 코드를 보시면 됩니다.
package BJ;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
public class BJ_뱀 {
static int N;
static int K;
static int r, c;
static int L;
static int[][] map;
static int[] dx = { 1, 0, -1, 0 };
static int[] dy = { 0, 1, 0, -1 };
static List<int[]> snake;
public static void main(String[] args) throws 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];
snake = new LinkedList<int[]>();
snake.add(new int[] { 1, 1 });
StringTokenizer st;
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
map[r][c] = 1;
}
L = Integer.parseInt(br.readLine());
Map<Integer, String> dir = new HashMap<>();
for (int i = 0; i < L; i++) {
st = new StringTokenizer(br.readLine());
dir.put(Integer.parseInt(st.nextToken()), st.nextToken());
}
int time = dfs(1, 1, 0, dir);
System.out.println(time);
}
private static int dfs(int y, int x, int nowDir, Map<Integer, String> dir) {
int time = 0; // 현재 진행 시간
while(true) {
time++; // while문이 한번 돌때 마다 ++
int nx = x + dx[nowDir]; // 진행 방향에 맞게
int ny = y + dy[nowDir]; // 방향 설정 후 이동
if(nx < 1 || ny < 1 || nx >= N + 1 || ny >= N + 1) {
break;
} // 범위를 벗어나면 while문 break;
for (int i = 0; i < snake.size(); i++) {
if(nx == snake.get(i)[1] && ny == snake.get(i)[0]) {
return time;
}
} // 뱀이 벽이나 자신의 몸에 머리가 부딛히면 함수 종료
if(map[ny][nx] == 1) { // 사과일 경우
map[ny][nx] = 0; // 사과를 먹는다
snake.add(new int[] {ny, nx}); // 뱀의 길이가 길어짐
}else {
snake.add(new int[] {ny, nx}); // 뱀이 움직임
snake.remove(0); // 원래 있던 꼬리 부분을 없앰
}
x = nx; // 현재 이동 좌표
y = ny; // 현재 이동 좌표
if(dir.containsKey(time)) { // dir에 time과 같은 경우가 있으면
if(dir.get(time).equals("D")) { // D일 경우
nowDir++; // 오른쪽으로 턴
if(nowDir == 4) { // 다시 0으로
nowDir = 0;
}
}
else if(dir.get(time).equals("L")) { // L일 경우
nowDir--; // 왼쪽으로 턴
if(nowDir == -1) { // 다시 3으로
nowDir = 3;
}
}
}
}
return time;
}
}
Ysik Github : https://github.com/Y1sik/Algorithm/blob/main/BJ/BJ_%EB%B1%80.java
반응형
'알고리즘' 카테고리의 다른 글
[Java] 백준 11055번 가장 큰 증가 부분 수열 (0) | 2022.04.19 |
---|---|
[Java] 백준 1159번 농구 경기 (0) | 2022.04.18 |
[Java] 백준 2745번 진법 변환 (0) | 2022.04.16 |
[Java] 백준 1357번 뒤집힌 덧셈 (0) | 2022.04.15 |
[Java] 백준 14503번 로봇 청소기 (0) | 2022.04.14 |