알고리즘
69. 이진트리 넓이 우선 탐색 [BFS]
홍루피
2021. 1. 27. 16:46
인프런 - it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 강의를 바탕으로 공부한 내용입니다.
문제는 비공개로 입력예제와 출력예제만을 가지고 포스팅
입력예제 1
1 2
1 3
2 4
2 5
3 6
3 7
출력예제 1
1 2 3 4 5 6 7
풀이
- 큐를 배열로 구현(선입선출 구조, 먼저 들어온것이 먼저 나감 <-> 스택: 후입선출)
- front와 back을 이용한다 (둘 다 -1로 초기화)
* front: back을 따라가며 하나씩 출력함
* back: 해당 정점에 연결된 정점을 배열에 넣어줌
Q[0]=1;
ch[1]=1; 을 해준 후 시작 (back = 0, front = -1인 상태)
while(front<back) => front가 back을 따라가면서 출력하기 때문에 front는 back보다 작아야한다
x=Q[++front] => x변수를 사용해 들어온 1을 출력한다. front=0으로 증가시킨다.
for(i=0;i<map[x].size();i++) => x에 연결된 정점을 탐색하기 하기 위해 for문 사용
if(ch[map[x][i]]==0) => 방문하지 않았으면
ch[map[x][i]]=1 => 체크를 1로 변경 후
Q[++back]=map[x][i]; => back을 움직여 연결된 정점인 map[x][i] 값을 넣어준다 (back=1, front=0)
#include<stdio.h>
#include<vector>
using namespace std;
int Q[100], front=-1, back=-1, ch[10];
vector<int> map[10];
//69. 이진트리 넓이우선탐색(BFS) = 레벨탐색 > 큐 사용
int main(){
int i, a, b, x;
for(i=1;i<=6;i++){
scanf("%d %d", &a, &b);
map[a].push_back(b);
map[b].push_back(a);
}
Q[++back]=1;
ch[1]=1;
while (front<back) {
//front가 back보다 작아야 함, 같아지는 순간 큐가 비어있다는 의미
x=Q[++front];
printf("%d ", x);
for(i=0;i<map[x].size();i++){
if(ch[map[x][i]]==0){
ch[map[x][i]]=1;
Q[++back]=map[x][i];
}
}
}
return 0;
}