BaekJoon

[BaekJoon] 3190번 뱀 (Java) 문제 풀이 [Gold 4]

Tenacity_Dev 2024. 3. 10. 21:49
728x90

문제

https://www.acmicpc.net/problem/3190

 

3190번: 뱀

'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

 

어떻게 풀 것인가?

구현, 시뮬레이션 문제이다.

하지만 생각할 것이 많아서 어려운 문제였다.

  1. 시간을 재고,
  2. 뱀 이동하기
  3. 범위를 벗어나거나, 뱀 몸통 만날 때 종료
  4. 사과가 있을 때 없을 때 처리
  5. 방향을 바꿔주는 시간을 만날 때 방향 변경
  6. 현재값 업데이트 

위와 같은 로직을 While문을 통해서 반복해야한다.

답안 코드를 본다면 너무나도 쉽지만, 생각을 코드로 옮긴다는 것은 어려운 일인 것 같다.

 

풀면서 놓쳤던점

없음. 단순 실력 부족

 

이 문제를 통해 얻어갈 것

구현 문제에 대한 연습

 

내 코드 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.StringTokenizer;


public class Main {

    static int N;
    static int[][] arr;
    static List<int[]> snake = new ArrayList<>();
    static HashMap<Integer, String> hash = new HashMap<>();
    static int[] dx = {0, 1, 0, -1};
    static int[] dy = {1, 0, -1, 0}; // 동 남 서 북

    static int result = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        N = Integer.parseInt(br.readLine());
        arr = new int[N][N];
        int K = Integer.parseInt(br.readLine());
        for (int i = 0; i < K; i++) {
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken()) - 1;
            int y = Integer.parseInt(st.nextToken()) - 1;
            arr[x][y] = 1;
        }

        int order = Integer.parseInt(br.readLine());
        for (int i = 0; i < order; i++) {
            st = new StringTokenizer(br.readLine());
            hash.put(Integer.parseInt(st.nextToken()), st.nextToken());
        }

        moving();

        System.out.println(result);
    }

    private static void moving() {
        int cx = 0, cy = 0;
        int d = 0;
        snake.add(new int[]{0, 0});

        while (true) {
            // 1. 시간재기
            result++;

            // 2. 뱀 이동하기
            int nx = cx + dx[d];
            int ny = cy + dy[d];

            // 3. 범위를 벗어나거나, 뱀 몸통 만날 때 종료
            if (isFinish(nx, ny))
                break;

            // 4. 사과가 있을 때 없을 때 처리
            if (arr[nx][ny] == 1) {
                arr[nx][ny] = 0;
                snake.add(new int[]{nx, ny});
            } else {
                snake.add(new int[]{nx, ny});
                snake.remove(0);
            }

            // 5. 방향을 바꿔주는 시간을 만날 때 방향 변경
            if (hash.containsKey(result)) {
                if (hash.get(result).equals("D")) {
                    d += 1;
                    if (d == 4)
                        d = 0;
                } else {
                    d -= 1;
                    if (d == -1)
                        d = 3;
                }
            }

            cx = nx;
            cy = ny;
        }
    }

    public static boolean isFinish(int nx, int ny) {
        if (nx < 0 || ny < 0 || nx >= N || ny >= N) {
            return true;
        }

        for (int[] t : snake) {
            if (nx == t[0] && ny == t[1])
                return true;
        }
        return false;
    }

}

 

참고

https://velog.io/@kimmjieun/%EB%B0%B1%EC%A4%80-3190%EB%B2%88-%EB%B1%80-Java-%EC%9E%90%EB%B0%94

 

728x90