🔺 문제
3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
import java.util.*;
import java.io.*;
public class Main {
static int[] dx = {0, 1, 0, -1}; // 동 남 서 북
static int[] dy = {1, 0, -1, 0};
static int N, apple, L;
static int[][] board;
static List<int[]> snake = new ArrayList<>(); // 🔔
static HashMap<Integer, String> map = new HashMap<>(); // 🔔
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine()); // 보드 크기
apple = Integer.parseInt(br.readLine()); // 사과 개수
board = new int[N][N];
while(apple --> 0) {
st = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(st.nextToken()) - 1;
int b = Integer.parseInt(st.nextToken()) - 1;
board[a][b] = 1; // 사과 위치
}
L = Integer.parseInt(br.readLine()); // 뱀의 방향 변환 횟수
while(L --> 0) {
st = new StringTokenizer(br.readLine(), " ");
int X = Integer.parseInt(st.nextToken());
String cmd = st.nextToken();
map.put(X, cmd);
}
solve();
}
private static void solve() {
// 시작점
int x = 0;
int y = 0;
int time = 0;
int d = 0;
snake.add(new int[] {0, 0});
while(true) {
// 1. 시간 재기
time++;
// 2. 뱀 이동하기
int nx = x + dx[d];
int ny = y + dy[d];
// 3. 범위를 벗어나거나, 뱀 몸통 만나면 종료
if(isFinish(nx,ny)) {
break;
}
// 4. 사과 있는지 체크
if(board[nx][ny] == 1) { // 사과 먹으면
board[nx][ny] = 0;
snake.add(new int[] {nx, ny});
}
else {
snake.add(new int[] {nx, ny});
snake.remove(0); // snake 꼬리 제거
}
// 5. 방향 바꿔주는 시간일 때, 방향 변경
if(map.containsKey(time)) {
if(map.get(time).equals("D")) { // 오른쪽으로 90도 회전
d += 1;
if(d == 4) d = 0;
}
else { // 왼쪽으로 90도 회전
d -= 1;
if(d == -1) d = 3;
}
}
// 6. 현재 이동 좌표 업데이트
x = nx;
y = ny;
}
System.out.println(time);
}
private static boolean isFinish(int nx, int ny) {
if(nx < 0 || ny < 0 || nx >= N || ny >= N) {
return true;
}
for(int i = 0 ; i < snake.size() ; i++) {
int[] tmp = snake.get(i);
if(nx == tmp[0] && ny == tmp[1]) {
return true;
}
}
return false;
}
}
|
cs |
✅ 해결 아이디어
✔ 구현 - 큐
while(true) {
1. 시간재기
2. 뱀 이동하기
3. 범위를 벗어나거나, 뱀 몸통 만날 때 종료
4. 사과가 있을 때 없을 때 처리
5. 방향 바꿔주는 시간 만날 때 방향 변경
6. 현재값 업데이트
}
🔺 다른 풀이들
- 거의 비슷한데 큐 사용하심
https://loosie.tistory.com/269
[BOJ] 백준 3190번 뱀 (Java)
#3190 뱀 난이도 : 골드 5 유형 : 자료 구조/ Queue 3190번: 뱀 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가
loosie.tistory.com
💬 느낀 점
이런 뱀 같은 문제를 봤나...........ㅎ
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
✔ 풀이 참고
[백준] 3190번 뱀 - Java, 자바
골드 5https://www.acmicpc.net/problem/3190참고 https://loosie.tistory.com/269https://leveloper.tistory.com/39
velog.io
[Java] 백준 3190번 뱀
https://www.acmicpc.net/problem/3190 3190번: 뱀 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의
y1sik-developmentdiary.tistory.com
- dx, dy 관련 & 뱀의 다음 방향 설정 부분도 약간 다르심
[백준] 3190번 뱀 (Java)
백준 3190번 뱀: https://www.acmicpc.net/problem/3190 3190번: 뱀 문제 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가
leveloper.tistory.com
- 그림 과정
백준 3190번 : 뱀 java
이 문제는 사과가 있는 곳을 입력받아서 뱀이 사과가 있는 곳을 지나치면 뱀의 길이를 늘이고 아니면 유지하게 합니다. 그리고 시간이 경과함에 따라서 방향을 회전시키게 해서 뱀이 벽이나 자
dy-coding.tistory.com
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 1302번: 베스트셀러 (0) | 2023.08.06 |
---|---|
[백준/JAVA] 2630번: 색종이 만들기 (0) | 2023.08.04 |
[백준/JAVA] 1347번: 미로 만들기 (0) | 2023.08.03 |
[백준/JAVA] 18406번: 럭키 스트레이트 (0) | 2023.08.03 |
[백준/JAVA] 1515번: 수 이어 쓰기 (0) | 2023.08.03 |