[Algorithm] 바둑이 승차(이진트리 DFS)
2023. 10. 11. 11:56ㆍTrip to Algorithm
주어진 배열값 들의 부분합들중 limit을 넘지 않는 최대합을 구하는 것으로 오타 때문에 한참 걸렸다.
이진트리 완전 탐색에 조금씩 익숙해지는 중.
const input = require("fs")
.readFileSync("example.txt")
.toString()
.replaceAll("\r", "")
.split("\n");
let [limit, n] = input[0].split(" ");
limit = Number(limit)
n = Number(n)
let dogs = [];
for (let i = 1; i <= n; i++) {
dogs.push(input[i]);
}
dogs = dogs.map(Number);
dogs.unshift(0);
console.log(dogs)
const visited = new Array(n + 1).fill(0);
let best = 0;
const DFS = (num) => {
if (num == n + 1) {
let weight = 0;
for (let i = 1; i <= n; i++) {
if (visited[i] == 1) {
weight += dogs[i];
}
}
if (weight <= limit) {
best = Math.max(weight, best);
return
}
return;
} else {
visited[num] = 1;
DFS(num + 1);
visited[num] = 0
DFS(num + 1);
}
};
DFS(1)
console.log(best)
풀긴 풀었는데 백준처럼 푸느라 데이터 처리가 있던 것을 제외하더라도 모든 경우의 수를 처리하는 것이 문제였다.
function solution(c, arr) {
let answer=Number.MIN_SAFE_INTEGER;
let n = arr.length;
function DFS(L, sum) {
if (sum > c) return;
if (L == n) {
answer = Math.max(answer, sum);
} else {
DFS(L + 1, sum + arr[L]);
DFS(L + 1, sum);
}
}
DFS(0, 0);
return answer;
}
let arr = [81, 58, 42, 33, 61];
console.log(solution(259, arr));
훨씬 더 깔끔한 풀이가 가능하다. 모든 경우의 수를 찾지 않아도 되고 보다 더 직관적으로 이해가 된다.
'Trip to Algorithm' 카테고리의 다른 글
[Algorithm] 합이 같은 부분집합(이진트리 DFS) (0) | 2023.10.10 |
---|---|
[Algorithm] 부분집합 구하기(이진트리 DFS) (0) | 2023.10.10 |
[Algorithm] 이진트리순회(DFS: 깊이우선탐색) (0) | 2023.10.09 |
[Algorithm] 이진수 출력(재귀) (1) | 2023.10.09 |
[Algorithm] 재귀함수와 스택프레임 (1) | 2023.10.09 |