Recursive, Tree, Graph - 0708. 송아지 찾기1(BFS)
private static int solution(int n, int m) {
int answer = 0;
Queue<Integer> Q = new LinkedList<>();
Q.add(n);
while(true) {
int len = Q.size();
for(int i=0; i<len; i++) {
int x = Q.poll();
if(x == m) return answer;
if(x < m - 5) Q.add(x + 5);
else if(x < m) {
Q.add(x + 5);
Q.add(x + 1);
} else Q.add(x - 1);
}
answer++;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
System.out.println(solution(n, m));
}
int answer=0;
int[] dis={1, -1, 5};
int[] ch;
Queue<Integer> Q = new LinkedList<>();
public int BFS(int s, int e){
ch=new int[10001];
ch[s]=1;
Q.offer(s);
int L=0;
while(!Q.isEmpty()){
int len=Q.size();
for(int i=0; i<len; i++){
int x = Q.poll();
for(int j=0; j<3; j++){
int nx=x+dis[j];
if(nx==e){
return L+1;
}
if(nx>=1 && nx<=10000 && ch[nx]==0){
ch[nx]=1;
Q.offer(nx);
}
}
}
L++;
}
return 0;
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
int s=kb.nextInt();
int e=kb.nextInt();
System.out.println(T.BFS(s, e));
}
해당 문제는 BFS(Breadth-First Search)
: 너비 우선 탐색
을 이용하여 풀 수 있다.
나의 풀이에서는 Queue
를 이용하여 기본적으로 너비 우선 탐색을 할 수 있도록 구성하고,
다음 3가지 조건을 두어 최소한의 연산을 수행하도록 하였다.
m-5
보다 작은 경우 : Q.add(x + 5)
m
보다 작고 m-5
보다 큰 경우 : Q.add(x + 5)
, Q.add(x + 1)
m
보다 큰 경우 : Q.add(x - 1)
위와 같은 조건을 통해 문제를 해결할 수 있다.
강의에서는 현재 좌표의 탐색 여부를 보관할 수 있는 배열을 두어 중복적인 탐색을 없애도록
구성하여 문제를 해결하였다.