# 공부 포인트
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();
}
}
}
}
'코딩 테스트 > 코딩 테스트' 카테고리의 다른 글
백트래킹 문제 - 왼편 절단 가능 소수 (0) | 2024.07.30 |
---|---|
분리 가능한 그래프인지 판단하기 - 인접 노드 플래그 판단 (0) | 2024.01.11 |
문자열 압축 해제문제로 살펴본 INTP와 재귀 알고리즘의 상관관계 (0) | 2023.09.18 |
백준 2155 (큐, 큐 복사, 홀수 짝수일 경우 판단) (0) | 2021.11.09 |