꾸준함의 미더덕 2023. 11. 8. 19:02

# 공부 포인트

 

1. 배열의 첫 인덱스를 1부터 세면 계산하기 편하게 n + 1로 생성하기

2. ArrayList 편하게 생성하기 -> Arrays.asList(1, 2);

3. 뱀이 자신을 밟는지 보기 위해서 Queue의 contains()로 확인

4. 방향 전환 테크닉 -> 시계방향으로 ArrayList에 넣은 후 % len 테크닉으로 확인

 

public class Practice5_ans {

    public static void main(String[] args) {
        // Test code
        int n = 6;
        int k = 3;
        int l = 3;
        ArrayList<ArrayList> apples = new ArrayList();
        apples.add(new ArrayList<>(Arrays.asList(3, 4)));
        apples.add(new ArrayList<>(Arrays.asList(2, 5)));
        apples.add(new ArrayList<>(Arrays.asList(5, 3)));

        Queue<ArrayList> moves = new LinkedList();
        moves.add(new ArrayList(Arrays.asList(3, 'D')));
        moves.add(new ArrayList(Arrays.asList(15, 'L')));
        moves.add(new ArrayList(Arrays.asList(7, 'D')));
        System.out.println((solution(n, k, l, apples, moves)));

        n = 10;
        k = 4;
        l = 4;
        apples.clear();
        apples.add(new ArrayList<>(Arrays.asList(1, 2)));
        apples.add(new ArrayList<>(Arrays.asList(1, 3)));
        apples.add(new ArrayList<>(Arrays.asList(1, 4)));
        apples.add(new ArrayList<>(Arrays.asList(1, 5)));

        moves.clear();
        moves.add(new ArrayList(Arrays.asList(8, 'D')));
        moves.add(new ArrayList(Arrays.asList(10, 'D')));
        moves.add(new ArrayList(Arrays.asList(11, 'D')));
        moves.add(new ArrayList(Arrays.asList(13, 'L')));
        System.out.println((solution(n, k, l, apples, moves)));

        n = 10;
        k = 5;
        l = 4;
        apples.clear();
        apples.add(new ArrayList<>(Arrays.asList(1, 5)));
        apples.add(new ArrayList<>(Arrays.asList(1, 3)));
        apples.add(new ArrayList<>(Arrays.asList(1, 2)));
        apples.add(new ArrayList<>(Arrays.asList(1, 6)));
        apples.add(new ArrayList<>(Arrays.asList(1, 7)));

        moves.clear();
        moves.add(new ArrayList(Arrays.asList(8, 'D')));
        moves.add(new ArrayList(Arrays.asList(10, 'D')));
        moves.add(new ArrayList(Arrays.asList(11, 'D')));
        moves.add(new ArrayList(Arrays.asList(13, 'L')));
        System.out.println((solution(n, k, l, apples, moves)));
    }

    public static Integer solution(int n, int k, int l, ArrayList<ArrayList> apples, Queue<ArrayList> moves) {
        int[][] map = new int[n + 1][n + 1]; // 계산 편의를 위해 n + 1
        for (ArrayList list : apples) {
            int i = (int) list.get(0);
            int j = (int) list.get(1);
            map[i][j] = 1;
        }

        ArrayList<ArrayList<Integer>> direction = new ArrayList<>(); // 방향전환 테크닉 주의
        direction.add(new ArrayList(Arrays.asList(0, 1))); //right
        direction.add(new ArrayList(Arrays.asList(1, 0))); //down
        direction.add(new ArrayList(Arrays.asList(0, -1))); //left
        direction.add(new ArrayList(Arrays.asList(-1, 0))); //up


        Queue<ArrayList<Integer>> snake = new LinkedList<>();
        snake.add(new ArrayList(Arrays.asList(1, 1)));

        int nowTime = 0;
        int idx = 0;
        int row = 1;
        int col = 1;
        while (true) {
            nowTime++;
            row += direction.get(idx).get(0);
            col += direction.get(idx).get(1);
            ArrayList head = new ArrayList(Arrays.asList(row, col));
            if (1 > row || row >= map.length || 1 > col || col >= map[0].length) { //1 로 계산했잖아.. 틀리지말자!
                return nowTime;
            }
            if (snake.contains(head)) { // ..? ArrayList 동등성 비교?
                return nowTime;
            }

            // 사과 먹기
            snake.add(head);
            if (map[row][col] == 1) { //먹으면
                map[row][col] = 0;
            } else { // 못먹으면 꼬리 자르기..
                snake.poll();
            }

            // 시간 체크해서 방향 선정하기..
            if (moves.size() > 0 && nowTime == (int) moves.peek().get(0)) {
                char direc = (char) moves.peek().get(1);
                if (direc == 'D') { // 오른쪽
                    idx = (idx + 1) % direction.size();
                } else { // 왼쪽
                    idx = (idx - 1 + direction.size()) % direction.size();
                }
                moves.poll();
            }
        }
    }
}