코테/백준

[백준/JAVA] 3190번: 뱀

imname1am 2023. 8. 3. 20:27
반응형

🔺 문제

 

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 = {010-1};   // 동 남 서 북
    static int[] dy = {10-10};
    
    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[] {00});
        
        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

 

반응형