관리 메뉴

LC Studio

백준 3190 뱀 (JAVA) 본문

Java/백준 알고리즘

백준 3190 뱀 (JAVA)

Leopard Cat 2022. 4. 27. 23:45

풀이

조건

1. 뱀이 몸통에 닿으면 죽는다.

2. 뱀이 벽에 닿으면 죽는다.

3. 사과를 먹으면 길이가 늘어난다.

 

어려운 문제였다. 

2차원 배열을 활용하여 풀다가 막혀서 다른 블로그를 참고하여 문제를 해결하였다.

https://loosie.tistory.com/269

 

[BOJ] 백준 3190번 뱀 (Java)

#3190 뱀 난이도 : 골드 5 유형 : 자료 구조/ Queue 3190번: 뱀  'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가

loosie.tistory.com

Queue를 활용하여 해결하였다. 주석을 자세히 작성하였으니, 읽으면 이해가 될 것이다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.StringTokenizer;

public class Solution{

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static StringTokenizer st = null;

    //시간과 방향 입력받을 Map형식의 moveInfo 선언
    static Map<Integer, String> moveInfo = new HashMap<>();

    //뱀의 이동을 결정하는 배열
    static int[] dx = {1, 0, -1, 0};
    static int[] dy = {0, 1, 0, -1};

    //사과의 위치를 담을 2차원배열 map
    static int[][] map;

    static int N;

    public static void main(String[] args) throws IOException{
        
        N = Integer.parseInt(br.readLine());
        int K = Integer.parseInt(br.readLine());

        map = new int[N][N];

        //사과의 위치를 map에 저장
        for(int i=0;i<K;i++){
            st = new StringTokenizer(br.readLine());
            int row = Integer.parseInt(st.nextToken())-1;
            int column = Integer.parseInt(st.nextToken())-1;
            map[row][column] = 1;
        }

        //시간과 방향을 moveInfo에 입력
        int L = Integer.parseInt(br.readLine());
        for(int i=0; i<L; i++){
            st = new StringTokenizer(br.readLine());
            int time = Integer.parseInt(st.nextToken());
            String direction = st.nextToken();
            moveInfo.put(time, direction);
        }
        System.out.println(moveInfo);
        
        solve();
    }

    static void solve() throws IOException{
        Queue<Integer> q = new LinkedList<>();
        q.add(0);
        
        int time = 0; // 총 시간
        int px = 0; // 뱀의 x좌표(열)
        int py = 0; // 뱀의 y좌표(행)
        int d = 0; // 방향 지시 변수 

        while(true){
            int nx = px + dx[d];
            int ny = py + dy[d];
            time++;
            System.out.println("nx : "+nx);
            System.out.println("ny : "+ny);

            //벽에 부딪히는 경우
            if(nx<0 || ny<0 || nx>N-1 || ny>N-1){
                break;
            }

            //몸통에 부딪히는 경우
            if(q.contains(ny*N + nx)){
                break;
            }

            //뱀 이동 시작
            if(map[ny][nx] == 1){
                map[ny][nx] = 0;
                q.add(ny*N + nx);
                System.out.println(q.toString());
            }
            else{
                q.add(ny*N + nx);
                q.poll();
                System.out.println(q.toString());
            }

            //방향 전환
            if(moveInfo.containsKey(time)){
                String data = moveInfo.get(time);
                if(data.equals("D")){
                    d += 1; 
                    if(d == 4){
                        d = 0;
                    }
                }
                else{
                    d -= 1;
                    if(d == -1){
                        d = 3;
                    }
                }
            }
            px = nx;
            py = ny;
        }

        br.close();
        bw.write(time+"");
        bw.flush();
        bw.close();

    }
}

전체 코드이다. (중간에 이해를 위해 System.out.println을 넣었다.)

 

첫번째 예제를 출력하면 다음과 같다.

6                                 
3
3 4
2 5
5 3
3
3 D
15 L
17 D
nx : 1
ny : 0
[1]
nx : 2
ny : 0
[2]
nx : 3
ny : 0
[3]
nx : 3
ny : 1
[9]
ny : 2
[9, 15]
nx : 3
ny : 3
[15, 21]
nx : 3
ny : 4
[21, 27]
nx : 3
ny : 5
[27, 33]
nx : 3
ny : 6
9

반응형