3190 - 뱀

slee2·2022년 1월 3일
0

백준

목록 보기
20/20

문제

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

풀이

먼저 이 문제를 해결하기 위해 map을 선언하고 5x5가 있다면 6x6으로 만든 뒤 벽으로 둘러싼 형식을 만들었다. 그리고 사과의 위치를 2로 만들었다.

또, 덱을 통해 뱀의 각 위치를 표현했는데
col과 raw 두 개의 덱을 만들었고, 만약 꼬리의 위치를 알고 싶다면
map[col.getFirst()][raw.getFirst()]를 통해 구하는 방식이다.

조건은 네 가지가 있다.

1. 뱀이 움직일 곳이 0인 경우
2. 뱀이 움질일 곳이 2인 경우
3. 뱀이 움직일 곳이 1 또는 3인 경우(벽이거나 자신의 몸)
4. 방향 전환을 해야하는 경우

이 조건에 맞춰서 로직을 만들면 된다.

import java.io.*;
import java.util.ArrayDeque;
import java.util.Deque;

public class Num3190 {

    public static int N;
    public static int K;
    public static int map[][];
    public static int L;
    public static String order[];

    public static Deque<Integer> col = new ArrayDeque<>();
    public static Deque<Integer> raw = new ArrayDeque<>();
    public static int count = 0;

    public static int direction = 0;

    public static void main(String[] args) throws IOException {
        //input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        N = Integer.parseInt(br.readLine());
        K = Integer.parseInt(br.readLine());
        map = new int[N+2][N+2];
        for (int i=0; i<N+2; i++) {
            for (int j=0; j<N+2; j++) {
                if (i==0 || j==0 || i==N+1 || j==N+1)
                    map[i][j] = 1;
            }
        }
        for (int i=0; i<K; i++) {
            String[] a = br.readLine().split(" ");
            map[Integer.parseInt(a[0])][Integer.parseInt(a[1])] = 2;
        }

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

        order = new String[L];
        for (int i=0; i<L; i++) {
            order[i] = br.readLine();
        }

        //logic
        col.addLast(1);
        raw.addLast(1);
        int i=0;
        String[] a = order[i].split(" ");
        while (true) {
            int b_col = col.getLast();
            int b_raw = raw.getLast();
            map[b_col][b_raw] = 3;
            if (count == Integer.parseInt(a[0])) {
                if (a[1].equals("L")) {
                    if (direction == 0)
                        direction = 3;
                    else
                        direction--;
                } else if (a[1].equals("D")) {
                    if (direction == 3)
                        direction = 0;
                    else
                        direction++;
                }
                i++;
                if (i < L)
                    a = order[i].split(" ");
            }
            int n_col=0;
            int n_raw=0;
            if (direction == 0)
                n_raw++;
            else if (direction == 1)
                n_col++;
            else if (direction == 2)
                n_raw--;
            else if (direction == 3)
                n_col--;

            count++;

            if (map[b_col + n_col][b_raw + n_raw] == 0) {
                map[col.pollFirst()][raw.pollFirst()] = 0;
                col.addLast(b_col + n_col);
                raw.addLast(b_raw + n_raw);
                map[b_col + n_col][b_raw + n_raw] = 3;
            } else if (map[b_col + n_col][b_raw + n_raw] == 2) {
                col.addLast(b_col + n_col);
                raw.addLast(b_raw + n_raw);
                map[b_col + n_col][b_raw + n_raw] = 3;
            } else if (map[b_col + n_col][b_raw + n_raw] == 1 || map[b_col + n_col][b_raw + n_raw] == 3) {
                break;
            }
        }


        //output
        bw.write(String.valueOf(count));
        bw.flush();
        bw.close();
    }
}

0개의 댓글

관련 채용 정보