최대 점수 구하기 : Dynamic Programming (냅색 알고리즘)
동전 교환 문제와 유사하게 풀 수 있다.
하지만 결정적인 차이는 '중복'해서 사용할 수 있느냐 인데,
이를 고려하지 않고 풀어서 잘못된 풀이가 나왔다!
내 풀이 - 잘못된 풀이
function solution(m, arr) {
let answer;
let dy = Array.from({ length: m + 1 }, () => 0); // 한 문제당 점수가 0점 이상이라는 가정
for (let i = 0; i < arr.length; i++) {
for (let j = arr[i][1]; j <= m; j++) {
dy[j] = Math.max(dy[j], dy[j - arr[i][1]] + arr[i][0]);
}
}
answer = dy[m];
return answer;
}
let arr = [
// [점수, 시간]
[10, 5],
[25, 12],
[15, 8],
[6, 3],
[7, 4]
];
console.log(solution(20, arr));
나름 한참 고민해서 푼 풀이인데...ㅋㅋ (심지어 답도 맞게 나옴)
중복을 고려하지 않은 틀린 풀이이다.
Solution 풀이
function solution(m, arr) {
let answer;
let dy = Array.from({ length: m + 1 }, () => 0); // 한 문제당 점수가 0점 이상이라는 가정
for (let i = 0; i < arr.length; i++) {
for (let j = m; j >= arr[i][1]; j--) {
dy[j] = Math.max(dy[j], dy[j - arr[i][1]] + arr[i][0]);
}
}
answer = dy[m];
return answer;
}
let arr = [
// [점수, 시간]
[10, 5],
[25, 12],
[15, 8],
[6, 3],
[7, 4]
];
console.log(solution(20, arr));
아무리 고민을 했어도 거꾸로
for문
을 돌리는 아이디어 는 생각을 못했을 것 같다.
풀이를 보고도 이해가 안되서 종이에 한참 그려보면서 이해를 했다.
동전 교환 문제와 함께 중복의 유무에 따른 풀이 차이를 이해하면서 여러 번 풀어보아야 겠다.
Author And Source
이 문제에 관하여(최대 점수 구하기 : Dynamic Programming (냅색 알고리즘)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@frenchkebab/최대-점수-구하기-Dynamic-Programming-냅색-알고리즘저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)