From f1842fb809b8b9e111a08b764e3e0767dae2933f Mon Sep 17 00:00:00 2001 From: devwqc Date: Mon, 9 Sep 2024 05:45:13 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[=EC=A0=95=EB=B4=89=EC=B0=AC]=2010-5.=20?= =?UTF-8?q?=EC=B5=9C=EB=8C=80=EC=A0=90=EC=88=98=20=EA=B5=AC=ED=95=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../index.js" | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git "a/10. Dynamic programming(\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225)/05. \354\265\234\353\214\200\354\240\220\354\210\230 \352\265\254\355\225\230\352\270\260/\354\240\225\353\264\211\354\260\254/index.js" "b/10. Dynamic programming(\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225)/05. \354\265\234\353\214\200\354\240\220\354\210\230 \352\265\254\355\225\230\352\270\260/\354\240\225\353\264\211\354\260\254/index.js" index 7e9e9b32..f70f98b3 100644 --- "a/10. Dynamic programming(\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225)/05. \354\265\234\353\214\200\354\240\220\354\210\230 \352\265\254\355\225\230\352\270\260/\354\240\225\353\264\211\354\260\254/index.js" +++ "b/10. Dynamic programming(\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225)/05. \354\265\234\353\214\200\354\240\220\354\210\230 \352\265\254\355\225\230\352\270\260/\354\240\225\353\264\211\354\260\254/index.js" @@ -1,6 +1,39 @@ +/* +✅문제 제목: 최대점수 구하기 + +✅문제 유형: DP + +✅문제 풀이 날짜: 2024-09-09 + +💡문제 분석 요약 + - N개의 문제가 있다. 각 문제는 점수와 푸는데 걸리는 시간이 주어진다. + - 제한시간 M안에 N개의 문제 중 최대점수를 얻을 수 있도록 한다. + - 문제의 개수 N(1<=N<=20), 제한시간 M(10<=M<=300) + +💡알고리즘 설계 + - 제한 시간 + 1만큼의 dy 배열을 만들고 각 요소를 0으로 초기화한다. + - arr을 제한시간을 기준으로 오름차순한다. 제한시간이 같다면 점수를 기준으로 내림차순한다. + - arr을 길이만큼 i = 0부터 반복문을 돈다. + - i번째 요소의 제한 시간을 j의 시작점으로 m까지 반복문을 돈다. + - dy[j]에 dy[j]의 값과 (dy[j - i번째 요소의 제한 시간] + i번째 요소의 점수) 중에서 큰 값을 할당한다. +*/ + function solution(m, arr) { let answer = 0; + const dy = Array.from({ length: m + 1 }, () => 0); + + const sortedArr = arr.sort((a, b) => a[1] - b[1] || b[0] - a[0]); + + for (let i = 0; i < sortedArr.length; i++) { + const [score, time] = sortedArr[i]; + for (let j = time; j <= m; j++) { + dy[j] = Math.max(dy[j], dy[j - time] + score); + } + } + + answer = dy[m]; + return answer; } @@ -11,4 +44,4 @@ let arr = [ [6, 3], [7, 4], ]; -console.log(solution(20, arr)); +console.log(solution(20, arr)); // 41 From b9f89e97157979e9e8c3e45c4eb1a99f74a17ed1 Mon Sep 17 00:00:00 2001 From: devwqc Date: Mon, 9 Sep 2024 05:56:54 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[=EC=A0=95=EB=B4=89=EC=B0=AC]=2010-5.=20?= =?UTF-8?q?=EC=B5=9C=EB=8C=80=EC=A0=90=EC=88=98=20=EA=B5=AC=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EC=98=A4=EB=8B=B5=ED=92=80=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../index.js" | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git "a/10. Dynamic programming(\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225)/05. \354\265\234\353\214\200\354\240\220\354\210\230 \352\265\254\355\225\230\352\270\260/\354\240\225\353\264\211\354\260\254/index.js" "b/10. Dynamic programming(\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225)/05. \354\265\234\353\214\200\354\240\220\354\210\230 \352\265\254\355\225\230\352\270\260/\354\240\225\353\264\211\354\260\254/index.js" index f70f98b3..2085a09d 100644 --- "a/10. Dynamic programming(\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225)/05. \354\265\234\353\214\200\354\240\220\354\210\230 \352\265\254\355\225\230\352\270\260/\354\240\225\353\264\211\354\260\254/index.js" +++ "b/10. Dynamic programming(\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225)/05. \354\265\234\353\214\200\354\240\220\354\210\230 \352\265\254\355\225\230\352\270\260/\354\240\225\353\264\211\354\260\254/index.js" @@ -16,6 +16,9 @@ - arr을 길이만큼 i = 0부터 반복문을 돈다. - i번째 요소의 제한 시간을 j의 시작점으로 m까지 반복문을 돈다. - dy[j]에 dy[j]의 값과 (dy[j - i번째 요소의 제한 시간] + i번째 요소의 점수) 중에서 큰 값을 할당한다. + +❌오답 + - 앞에서부터 반복문을 돌면 같은 문제를 중복으로 풀게된다. */ function solution(m, arr) { @@ -45,3 +48,41 @@ let arr = [ [7, 4], ]; console.log(solution(20, arr)); // 41 + +/* +✅문제 제목: 최대점수 구하기 + +✅문제 유형: DP + +✅문제 풀이 날짜: 2024-09-09 + +💡문제 분석 요약 + - N개의 문제가 있다. 각 문제는 점수와 푸는데 걸리는 시간이 주어진다. + - 제한시간 M안에 N개의 문제 중 최대점수를 얻을 수 있도록 한다. + - 문제의 개수 N(1<=N<=20), 제한시간 M(10<=M<=300) + +💡알고리즘 설계 + - 제한 시간 + 1만큼의 dy 배열을 만들고 각 요소를 0으로 초기화한다. + - arr을 길이만큼 i = 0부터 반복문을 돈다. + - j는 m부터 i번째 요소의 시간까지 거꾸로 반복문을 돈다. + - dy[j]에 dy[j]의 값과 (dy[j - i번째 요소의 제한 시간] + i번째 요소의 점수) 중에서 큰 값을 할당한다. +*/ + +function solution2(m, arr) { + let answer = 0; + + const dy = Array.from({ length: m + 1 }, () => 0); + + for (let i = 0; i < arr.length; i++) { + const [score, time] = arr[i]; + for (let j = m; j >= time; j--) { + dy[j] = Math.max(dy[j], dy[j - time] + score); + } + } + + answer = dy[m]; + + return answer; +} + +console.log(solution2(20, arr)); // 41