BFS란?
- 최단 거리를 찾는 알고리즘
- Queue를 사용하며 Level별 탐색을 함
진행방법
- 노드를 만든다
- 큐를 만들어서 첫번째 노드를 넣는다
- while (!queue.isEmpty)로 큐를 진행한다.
- for문으로 남아 있는 큐를 돌면서 Node와 연결된 노드를 큐를 찾는다.
- 큐에서 데이터 1개를 빼낸다. (여기선 첫번째로 1이 빠지게 됨)
- 그리고 큐에 연결된 노드를 넣는다.
- for문이 끝나고 레벨을 증가시킨다.
- 결과적으로
LEVEL 0 : 1
LEVEL 1 : 2 -> 3
LEVEL 2 : 4->5->6->7이 돌고 더 이상 연결된것이 없기 때문에 큐를 종료한다.
코드
package inflearn.section7_bfs;
import java.util.*;
class Node {
Node lt,rt;
int data;
Node(int value) {
data=value;
lt=rt=null;
}
}
public class Main1 {
Node root;
public void bfs(Node root) {
Queue<Node>queue=new LinkedList<>();
queue.add(root);
int level=0;
while (!queue.isEmpty()) {
System.out.print(level+" : ");
int size=queue.size();
for (int i=0;i<size;i++) {
Node node=queue.poll();
System.out.print(node.data+" ");
if (node.lt!=null) queue.add(node.lt);
if (node.rt!=null) queue.add(node.rt);
}
System.out.println();
level++;
}
}
public static void main(String[] args) {
Main1 main=new Main1();
main.root=new Node(1);
main.root.lt=new Node(2);
main.root.rt=new Node(3);
main.root.lt.lt=new Node(4);
main.root.lt.rt=new Node(5);
main.root.rt.lt=new Node(6);
main.root.rt.rt=new Node(7);
main.bfs(main.root);
}
}
문제 1. 송아지 찾기
해결방법
- while 문
- for문으로 큐를 돌고 연결한다 (+1, -1, +5)
- Level을 증가
- 해당 숫자를 찾으면 return문으로 빠져 나와 레벨을 출력한다.
package inflearn.section7_bfs;
import java.util.*;
public class Main2 {
static int n;
static int m;
int arr[]=new int[10001];
int dx[]={-1,1,5};
public int solution(int n) {
Queue<Integer> queue=new LinkedList<>();
int level=0;
queue.add(n);
arr[n]=1;
while (!queue.isEmpty()) {
int size=queue.size();
for (int i=0;i<size;i++) {
int k=queue.poll();
if (k==m) {
return level;
}
else {
for (int j=0;j<dx.length;j++) {
int nx=k+dx[j];
if (nx>=1 && nx<=10000 && arr[nx]==0) {
arr[nx]=1;
queue.add(nx);
}
}
}
}
level++;
}
int answer=0;
return answer;
}
public static void main(String[] args) {
Main2 main=new Main2();
Scanner scan=new Scanner(System.in);
n=scan.nextInt();
m=scan.nextInt();
System.out.println(main.solution(n));
}
}
Tree 말단 노드까지의 가장 짧은 경로
코드
package inflearn.section7_bfs;
import java.util.*;
class Node4 {
Node4 lt;
Node4 rt;
int val=0;
Node4(int val) {
lt=rt=null;
this.val=val;
}
}
public class Main4 {
Node4 node4;
public int bfs(int l,Node4 node4) {
Queue<Node4> queue=new LinkedList<>();
queue.add(node4);
while(!queue.isEmpty()) {
int size=queue.size();
for (int i=0;i<size;i++) {
Node4 node=queue.poll();
if (node.lt==null && node.rt==null) {
return l;
}
queue.add(node4.lt);
queue.add(node4.rt);
}
l++;
}
return 1;
}
public static void main(String[] args) {
Main4 main4 =new Main4();
main4.node4=new Node4(1);
main4.node4.lt=new Node4(2);
main4.node4.rt=new Node4(3);
main4.node4.lt.lt=new Node4(4);
main4.node4.lt.rt=new Node4(5);
int l=0;
System.out.println(main4.bfs(l,main4.node4));
}
}