Dev/백준
백준 1697번 java 풀이 - bfs
Aloner
2022. 12. 27. 15:38
728x90
반응형
풀이
이 문제는 bfs 알고리즘을 적용하여 풀면 쉽게 풀 수 있습니다.
큐와 배열을 이용하여 수빈이의 위치를 큐에 넣고 큐에서 값을 뽑을 때마다 갈 수 있는 위치(x-1, x+1,x*2)를 큐에 넣어주며 bfs함수를 다시 호출하는 방식으로 해결할 수 있습니다.
물론 시간을 줄이기 위해 boolean 배열을 사용하여 방문한 곳을 체크하는 조건을 추가할 수도 있습니다.
또한 이동 횟수(=시간)을 구해야 하기 때문에 배열을 하나 더 만들어 해당 인덱스까지 갈 때 소요되는 값을 저장해야 합니다.
코드
import java.util.*;
import java.io.*;
class Main{
static int[] array;
static boolean[] bool;
static int bro = 0;
static Queue<Integer> queue = new LinkedList<>();
public static void main(String[] args) throws java.lang.Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int subin = Integer.parseInt(st.nextToken());
bro = Integer.parseInt(st.nextToken());
if(subin >= bro){
array = new int[subin+1];
bool = new boolean[subin+1];
}else{
array = new int[bro*2];
bool = new boolean[bro*2];
}
queue.add(subin);
bool[subin] = true;
bfs(subin);
}
public static void bfs(int x){
int num = queue.poll();
int size = array.length;
if(num == bro){
System.out.println(array[num]);
return;
}
if(x > 0 && bool[x-1] == false){
queue.add(x-1);
array[x-1] = array[x] + 1;
bool[x-1] = true;
}
if(x < size - 1 && bool[x+1] == false){
queue.add(x+1);
array[x+1] = array[x] + 1;
bool[x+1] = true;
}
if(x*2 < size && bool[x*2] == false){
queue.add(x*2);
array[x*2] = array[x] + 1;
bool[x*2] = true;
}
bfs(queue.peek());
}
}
728x90
반응형