일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 백준
- type challenge
- Node.js
- 프로그래머스
- 문자열
- Crawling
- 수학
- dp
- 레벨 1
- Algorithm
- javascript
- 프로그래머스 레벨 2
- typescript
- 그래프
- 크롤링
- 알고리즘
- 가천대
- TCP
- BFS
- Nestjs
- HTTP 완벽 가이드
- dfs
- 자바스크립트
- socket
- 소켓
- HTTP
- 타입 챌린지
- ip
- 쉬운 문제
- 타입스크립트
- Today
- Total
kakasoo
[node.js] 평범한 배낭 ( 백준 12865번 ) 본문
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let COUNT;
let MAX_WEIGHT;
let weights = [0];
let values = [0];
rl.on("line", (line) => {
const arr = line.split(" ").map(Number);
if (!COUNT && !MAX_WEIGHT) {
COUNT = arr[0];
MAX_WEIGHT = arr[1];
} else {
weights.push(arr[0]);
values.push(arr[1]);
if (weights.length > COUNT) {
main();
process.exit();
}
}
});
const main = () => {
// 초기 배열은, 그 물건의 차례에서 각 무게 마다의 최대 가치를 저장한 배열이다.
const DP = new Array(weights.length).fill(0);
for (let i = 0; i < DP.length; i++) {
DP[i] = new Array(MAX_WEIGHT + 1).fill(0);
}
// i가 의미하는 것은 현재 아이템의 차례이다.
for (let i = 1; i < DP.length; i++) {
const cur_weight = weights[i];
const cur_value = values[i];
// j가 의미하는 것은 현재 아이템을 고려하는 순간에서의, 각각의 무게다.
// DP[i][j]의 의미는 그 아이템을 고려할 때, j 무게의 최대 가치다.
for (let j = 1; j <= MAX_WEIGHT; j++) {
// 해당 무게 차례에서, 현재 아이템의 무게를 뺄 수 없다면,
// 해당 무게에서의 최대 가치는 자연스럽게 이전 고려에서의 최대 가치다.
if (j - cur_weight < 0) {
DP[i][j] = DP[i - 1][j];
} else {
// 만약 뺄 수 있다면, 이전 고려에서의 해당 무게의 최대 가치와,
// 이전 고려에서 현재 물건을 담기 전의 (따라서 무게에서 현재 물건 무게를 빼야 한다.)
// 최대 가치에
// 현재 물건의 가치를 더하는 것이다.
DP[i][j] = Math.max(
DP[i - 1][j],
DP[i - 1][j - cur_weight] + cur_value
);
}
}
}
console.log(Math.max(...DP[DP.length - 1]));
};
DP 문제에서, 1부터 시작해도 되는 경우 ( 0이든 1이든 어쨌든 첫번째 경우의 수부터 시작하는 경우 )는 굳이 초기 값을 넣고 시작하지 말자.
그게 오답이 될 수도 있었다.
나는 100%에서 오답이 발생해서 반례를 찾아 돌아다녔는데, 초깃값을 정한 경우 때문이었다.
'프로그래밍 > 알고리즘 풀이' 카테고리의 다른 글
[node.js] 잃어버린 괄호 (백준 1541번) (0) | 2021.03.30 |
---|---|
[node.js] 포도주 시식 ( 백준 2165번 ) (0) | 2021.03.29 |
[node.js] 신나는 함수 실행 ( 백준 9184번 ) (0) | 2021.03.26 |
[node.js] A -> B ( 백준 16953번 ) (0) | 2021.03.26 |
[node.js] 팰린드롬수 ( 백준 1259번 ) (0) | 2021.03.26 |