숨바꼭질 시리즈로 숨바꼭질1과 차이점은 순간이동(현재 위치에서 2배로 이동)의 경우 0초로 계산한단 점이다.
처음 접근할 때는 들릴 위치를 stack에 저장, visited 배열을 이용해 한 번 들렸던 위치는 다시 들려보지 않도록 경우의 수를 줄이고, 배열을 초과하지 않게 if문으로 제한을 두고 푼 정도였다.
하지만 제출했더니 틀림으로 표시돼서 예외를 생각해봤는데, 만약 1부터 2까지 이동하는 시간을 구할 때 1->2 (+1로 이동) 하고 visited 표시 해준뒤 1->2(순간이동으로 이동)을 stack에 못 넣어서 0초를 출력하지 못하는 오류가 있었다.
문제를 맞추고 다른 사람 풀이를 봤는데 priority queue를 이용해 이동시간이 작은 것 부터 꺼내서 쓰는 방법이 더 좋았을거라 생각한다.
public static void main(String[] args) throws Exception {
// visited 배열을 2차원 배열로 만들고 1차원에 방문할 index들, 2차원에 방문했을 때 몇 초 인지 저장하기
int[][] visited = new int[100001][2];
ArrayList<int[]> stack = new ArrayList<>();
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int[] top = { n, 0 };
stack.add(top);
visited[top[0]][0] = 1;
visited[top[0]][1] = 0;
int answer = 100000;
int flag = 0;
while (!stack.isEmpty()) {
top = stack.remove(0);
visited[top[0]][0] = 1;
if (top[0] == k) {
if (top[1] < answer) {
answer = top[1];
}
flag = 1;
}
int[] element1 = new int[] { top[0] + 1, top[1] + 1 };
int[] element2 = new int[] { top[0] - 1, top[1] + 1 };
int[] element3 = new int[] { top[0] * 2, top[1] };
if (element1[0] <= 2 * k && element1[0] <= 100000) {
if (visited[element1[0]][0] != 1 && flag == 0) {
visited[element1[0]][0] = 1;
stack.add(element1);
visited[element1[0]][1] = element1[1];
} else if (visited[element1[0]][1] > element1[1]) {
stack.add(element1);
visited[element1[0]][1] = element1[1];
}
}
if (element2[0] >= 0) {
if (visited[element2[0]][0] != 1 && flag == 0) {
visited[element2[0]][0] = 1;
stack.add(element2);
visited[element2[0]][1] = element2[1];
} else if (visited[element2[0]][1] > element2[1]) {
stack.add(element2);
visited[element2[0]][1] = element2[1];
}
}
if (element3[0] <= 2 * k && element3[0] <= 100000) {
if (visited[element3[0]][0] != 1 && flag == 0) {
visited[element3[0]][0] = 1;
stack.add(element3);
visited[element3[0]][1] = element3[1];
} else if (visited[element3[0]][1] > element3[1]) {
stack.add(element3);
visited[element3[0]][1] = element3[1];
}
}
}
System.out.println(answer);
}