풀이
처음에 이 문제를 보고 어떠한 규칙을 찾기위해 노력을 했었다. 그러다 문득 바이너리 서치처럼 한번에 하나씩 하면 될것 같다는 생각이 들어 바이너리 서치로 접근을 해보았다. 그러나 바이너리 서치는 +1-1 *2중 무엇이 최적인지 몰랐고 그리디 알고리즘도 맞지 않았다. 그리하여 어떻게 하면 좋을까 생각을 하다 그냥 시간 생각하지말고 무작정 시간을 더하면 되지않을까? 라는 생각을 하게 되었고 그러한 생각을 꾸준히 하다보니 단순히 +1, -1, *2를 해서 특정배열에 담으면 될것 같다는 생각을 하게 되었고 이는 곧바로 정답으로 가게 되었다. 풀이의 발상은 단순하다 만약 현재의 위치가 x라면 x-1, x+1 x*2의 위치에 현재의 시간+1을 더하고 queue에 집어넣는것이다. 그러고 전부 끝나면 현재 queue에 있는 원소를 뽑아내어 반복을 한다. 그러다 현재의 위치와 K와 같아지면 거기서 멈추고 특정배열의 K값을 넣으면 이동하는데 걸리는 최소시간이 얻을수있다.
코드
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 Main{
public static Queue<Integer> queue = new LinkedList<Integer>();
public static Integer [] arr = new Integer[1000001];
public static int N, K;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
queue.offer(N);
int idx = -1;
arr[N] = 0;
if (N == K) {
System.out.println("0");
return;
}
while(!queue.isEmpty()){
idx = queue.poll();
if((idx-1 >= 0) && (arr[idx-1]==null)){
queue.offer(idx-1);
arr[idx-1] = arr[idx]+1;
if(idx-1 == K)
break;
}
if((idx +1 <1000001) && (arr[idx+1]==null)){
queue.offer(idx+1);
arr[idx+1] = arr[idx]+1;
if(idx+1 == K)
break;
}
if((idx * 2 < 1000001) && (arr[idx*2] == null)){
queue.offer(idx*2);
arr[idx*2] = arr[idx]+1;
if(idx*2 == K)
break;
}
}
System.out.println(arr[idx]+1);
}
}
'백준' 카테고리의 다른 글
[백준] 2579 계단 오르기 (JAVA) (0) | 2021.09.21 |
---|---|
[백준] 1932 정수 삼각형 (JAVA) (0) | 2021.09.21 |
[백준] 7576 토마토 (JAVA) (0) | 2021.09.15 |
[백준] 1149 RGB거리 (JAVA) (0) | 2021.09.15 |
[백준] 2667 단지번호붙이기 (JAVA) (0) | 2021.09.15 |