백준 3190 뱀 (Java,자바)

jonghyukLee·2021년 9월 23일
0

이번에 풀어본 문제는
백준 3190번 뱀 입니다.

📕 문제 링크

❗️코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

class Snake
{
    int head_x,head_y;
    int tail_x,tail_y;
    int dir;

    public Snake(int head_x, int head_y,int tail_x, int tail_y,int dir)
    {
        this.head_x = head_x;
        this.head_y = head_y;
        this.tail_x = tail_x;
        this.tail_y = tail_y;
        this.dir = dir;
    }
}
class Command
{
    int time;
    char dir;

    public Command(int time, char dir)
    {
        this.time = time;
        this.dir = dir;
    }
}
public class Main {
    static int [][] map;
    static Snake snake;
    static int res = 0;
    static int N;
    static Queue<Command> q;
    static int [] dx = {0,1,0,-1};
    static int [] dy = {1,0,-1,0};

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

        map = new int[N][N];

        StringTokenizer st;
        for(int i = 0; i < K; ++i)
        {
            st = new StringTokenizer(br.readLine());
            map[Integer.parseInt(st.nextToken())-1][Integer.parseInt(st.nextToken())-1] = -1;
        }

        int L = Integer.parseInt(br.readLine());

        snake = new Snake(0,0,0,0,0);
        q = new LinkedList<>();
        for(int i = 0; i < L; ++i)
        {
            st = new StringTokenizer(br.readLine());
            q.add(new Command(Integer.parseInt(st.nextToken()),st.nextToken().charAt(0)));
        }

        loop : while(true)
        {
            Command cur;
            if(!q.isEmpty())
            {
                cur = q.poll(); // 3 D
            }
            else
            {
               cur = new Command(10001,'X');
            }
            while(cur.time > res)
            {
                res++;
                map[snake.head_x][snake.head_y] = snake.dir + 1;
                snake.head_x += dx[snake.dir];
                snake.head_y += dy[snake.dir];
                if(!isValid(snake.head_x,snake.head_y) || map[snake.head_x][snake.head_y] > 0) break loop;
                if(map[snake.head_x][snake.head_y] == -1) continue; //사과
                int tmp_dir = map[snake.tail_x][snake.tail_y];
                map[snake.tail_x][snake.tail_y] = 0;
                snake.tail_x += dx[tmp_dir-1];
                snake.tail_y += dy[tmp_dir-1];
            }
            if(cur.dir == 'D')
            {
                if(snake.dir == 3)
                {
                    snake.dir = 0;
                }
                else snake.dir++;
            }
            else
            {
                if(snake.dir == 0)
                {
                    snake.dir = 3;
                }
                else snake.dir--;
            }
            map[snake.head_x][snake.head_y] = snake.dir;
        }
        System.out.print(res);
    }
    static boolean isValid(int x, int y)
    {
        return x >= 0 && y >= 0 && x < N && y < N;
    }
}

📝 풀이

학창시절에 많이 해봤던 지렁이게임? 문제인거같습니다 ㅋㅋㅋ
뱀이 매초 바라보는 방향으로 직진하며 초기 입력값으로 주어진 시간에 맞추어 방향을 틀어주는 게임입니다.
입력된 시간과 방향을 가진 Command 변수를 큐에 담아주고, 시간값이 같아질때까지 뱀이 직진하는 알고리즘을 구성했습니다. 그런데 아직 게임이 끝날 조건이 아님에도 큐가 비어 게임이 끝나버리는 오류를 발견해서, 큐가 비어있다면 가질 수 있는 최대값을 담아버리고, 벽에 부딪히거나 스스로 부딪히게 되는 종료조건이 될때까지 직진을 진행하도록 변경해 주었습니다.
맵에는 뱀이 지나칠 당시 가졌던 방향값을 남겨두어, 후에 꼬리를 당길때 해당 방향으로 당길 수 있도록 만들었습니다.

📜 후기

이번에도 문제를 잘못 이해해서 시간이 조금 걸렸던 문제입니다.
벽을 포함한 크기가 N x N 이라 생각해서, 테스트케이스의 정답도 이해가 가지 않아 애를 먹었네요ㅠ 문제의 표현이 애매한 것 같기도..^~^
금방 풀 수 있었을 것 같았던 문제여서 조금 아쉬웠습니다!

profile
머무르지 않기!

0개의 댓글