데이터의 구조는 선형구조, 비선형 구조로 이루어져 있는데 순차적으로 나열된 선형 구조에 비해 비선형 구조의 데이터는 탐색이 어렵다.
그때 사용하는 것이 DFS,BFS 탐색방법인데 우선은 DFS를 먼저 정리한다.
이 DFS방법은 두 가지의 방법이 있는데 첫 번째가 재귀이고, 두번째가 스택(반복문)을 이용하는 것이다.
DFS(Depth First Search)
비선형 구조의 데이터에서 가장 깊은 노드까지 탐색하는 방법이다.
- 탐색을 시작하는 노드를 스택에 넣고, 방문 처리를 한다.
- 방금 넣은 노드에 방문하지 않은 인접 노드가 있다면 인접노드로 이동하여 스택에 넣고 방문 처리를 한다.(반복)
- 만약 인접 노드가 없거나, 모든 노드를 방문했다면 스택에 쌓인 노드들을 pop한다.
- 이 방법을 반복하여 스택에 아무 것도 남아 있지 않을때까지 한다.
알고리즘 예시) **재귀를 이용
let arr = [1, 3, 5, 6, 7, 10];
//여기 배열에서 숫자들을 빼서 다른 집합을 하나 만들때 다른 부분집합의 누적 값이 기존 베열에 남아있는 값들의 누적값과 같은지 확인
//만약 그런 값 경우가 있다면 "YES"를 return
//ex)
//arr=[1,3,5,7] newArr=[6,10]
function solution(arr) {
let answer = 'NO',
flag = 0;
let total = arr.reduce((a, b) => a + b, 0);
let n = arr.length; //6
function DFS(L, sum) {
if (flag) return; //원하는 값이 있다면 더 이상 안 돌아도되므로 스탑
if (L === n) {
if (total - sum === sum) {
answer = 'YES';
flag = 1;
}
} else {
DFS(L + 1, sum + arr[L]);
DFS(L + 1, sum);
}
}
DFS(0, 0);
return answer;
}
let arr = [1, 3, 5, 6, 7, 10];
console.log(solution(arr));
javascript로 DFS 알고리즘을 공부하면서 확실히 어렵다고 많이 느끼고 있다.
지금 위에 코드도 stack 직접 그려가면서 이해했는데 익숙해지도록 꾸준히 반복해야겠다.
[코드 해석]
- 기존 arr의 배열을 다 더해서 total이라는 값에 넣어준다 (32)
- 하나씩 탐색해가며 sum에 다가 부분적인 값들을 더해 누적값을 넣어준다.
- total-sum = sum일 경우 "YES"를 리턴할 수 있도록 함
- 만약 이미 YES가 나왔다면 더 돌지 않도록 flag로 모두 return 해주기
참고블로그)
https://choonse.com/2022/02/16/945/
https://velog.io/@songyw0517/DFS%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
'알고리즘 정리' 카테고리의 다른 글
이진트리 순회(깊이우선탐색) (0) | 2023.05.25 |
---|---|
기본 재귀함수 (0) | 2023.05.24 |
Queue 자료구조 (0) | 2023.05.02 |
스택자료구조 사용한 후위식 (0) | 2023.05.01 |
해쉬 알고리즘 (1) | 2023.04.20 |