백준 12865번 - 평범한 배낭(Node.js)
https://www.acmicpc.net/problem/12865
12865번: 평범한 배낭
첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)
www.acmicpc.net

첫 번째 나의 풀이
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const readline = require("readline"); | |
const rl = readline.createInterface({ | |
input: process.stdin, | |
output: process.stdout, | |
}); | |
let input = []; | |
rl.on("line", function (line) { | |
input.push(line); | |
N = Number(input[0].split(" ")[0]); | |
K = Number(input[0].split(" ")[1]); | |
if (input.length - 1 === N) { | |
rl.close(); | |
} | |
}).on("close", function () { | |
let arr = []; | |
let worthArr = []; | |
let answer = 0; | |
for (let i = 1; i <= N; i++) { | |
arr[i - 1] = input[i].split(" ").map((el) => { | |
return Number(el); | |
}); | |
} | |
for (let i = 0; i < N; i++) { | |
for (let j = 0; j < N; j++) { | |
if (i !== j) { | |
if (arr[i][0] <= K) { | |
worthArr.push(arr[i][1]); | |
if (arr[i][0] + arr[j][0] <= K) { | |
worthArr.push(arr[i][1] + arr[j][1]); | |
} else { | |
continue; | |
} | |
} | |
} | |
} | |
} | |
answer = Math.max(...worthArr); | |
console.log(answer); | |
process.exit(); | |
}); |
- 제출시 결과는 틀렸습니다.
- 간단하게 이 코드에 대해 설명하자면, 이중 for문을 사용하여 모든 가치 or 가치의 합의 최댓값의 경우의 수를 worthArr이라는 배열에 넣어주고, worthArr의 값 중 최댓값을 답으로 설정하여 풀었다.
- 하지만, 이 방법에는 생각해보니 많은 오류가 있었다.
- 이중 for문을 사용했기 때문에, 최대 2개의 가치의 합만 계산하기 때문이다. 물론 문제의 입력 예제에는 2개의 가치의 합까지만 고려하도록 나와있지만, 입력의 수가 많고 고려해야할 가치의 갯수가 3개 이상이라면, 이 방법으로는 당연히 풀 수 없다.
두 번째 나의 풀이
- 제가 두 번째의 방법을 알았을 때는 처음에 이해가 가지 않아, 이해하는데 상당한 시간이 걸렸습니다..
- 이 문제는 물건을 쪼갤 수 없는 배낭문제(0/1 Knapsack Problem)라는 동적 프로그래밍 방법을 사용해야 풀 수 있습니다.
- 물건을 쪼갤 수 없는 배낭문제(0/1 Knapsack Problem)을 잘 모르시는 분들이라면, 아래의 링크를 클릭해서 이해하셔야 아래 코드를 이해할 수 있을 것 같습니다. 😂😂😂
2022.07.27 - [Algorithm] - 물건을 쪼갤 수 없는 배낭 문제(0/1 Knapsack Problem)
물건을 쪼갤 수 없는 배낭 문제(0/1 Knapsack Problem)
0/1 Knapsack Problem 다이나믹 프로그래밍(Dynamic Programming : DP)을 활용하여 해결할 수 있다.. DP는 큰 문제를 작은 문제로 쪼개서 해결한다. DP는 Devide-and-Conquer라는 원리에 기반을 두고 있으며, 이전..
hoonni3002.tistory.com
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const readline = require("readline"); | |
const rl = readline.createInterface({ | |
input: process.stdin, | |
output: process.stdout, | |
}); | |
let input = []; | |
rl.on("line", function (line) { | |
input.push(line); | |
N = Number(input[0].split(" ")[0]); | |
K = Number(input[0].split(" ")[1]); | |
if (input.length - 1 === N) { | |
rl.close(); | |
} | |
}).on("close", function () { | |
let dp = Array.from(new Array(N + 1), () => Array(K + 1).fill(0)); | |
let arr = []; | |
for (let i = 1; i <= N; i++) { | |
arr[i - 1] = input[i].split(" ").map((el) => { | |
return Number(el); | |
}); | |
} | |
for (let i = 1; i <= N; i++) { | |
for (let j = 1; j <= K; j++) { | |
if (j - arr[i - 1][0] >= 0) { | |
dp[i][j] = Math.max( | |
dp[i - 1][j], | |
arr[i - 1][1] + dp[i - 1][j - arr[i - 1][0]] | |
); | |
} else { | |
dp[i][j] = dp[i - 1][j]; | |
} | |
} | |
} | |
console.log(dp[N][K]); | |
process.exit(); | |
}); |
'Algorithm > Baekjoon' 카테고리의 다른 글
백준 11047번 - 동전 0(Node.js) (0) | 2022.07.28 |
---|---|
백준 10773번 - 제로(Node.js) (0) | 2022.07.27 |
물건을 쪼갤 수 없는 배낭 문제(0/1 Knapsack Problem) (1) | 2022.07.27 |
백준 2357번 - 최솟값과 최댓값(Node.js) (1) | 2022.07.24 |
백준 1676번 - 팩토리얼 0의 개수(Node.js) (0) | 2022.07.10 |