๐งฉ๋ฌธ์ ๋งํฌ
https://school.programmers.co.kr/learn/courses/30/lessons/389480
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก, ์ฑ์ฉ๊น์ง Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
๐งฉ๋ฌธ์ ํ์ด
โdfs๋ก ์ ๊ทผ -> ์คํจ ( ์๊ฐ์ด๊ณผ )
dfs๋ก ํผ ๋ฌธ์ ํ์ด๋ค. ํ์ง๋ง ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค.
function solution(info, n, m) {
let dp = Array.from({ length: info.length + 1 }, () => {
return Array(m).fill(Infinity);
});
dp[0][0] = 0;
for (let r = 1; r <= info.length; r++) {
let [aScore, bScore] = info[r - 1];
for (let c = 0; c < m; c++) {
dp[r][c] = Math.min(dp[r - 1][c] + aScore, dp[r][c]);
if (c + bScore < m) {
dp[r][c + bScore] = Math.min(dp[r - 1][c], dp[r][c + bScore]);
}
}
}
let min = Infinity;
dp[info.length].forEach((v) => {
if (v < n) {
min = Math.min(min, v);
}
});
return min === Infinity ? -1 : min;
}
โdp๋ก ์ ๊ทผ -> ์ฑ๊ณต
2์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค์ด ์์๋๋ก ๊ฐ์ ์ฑ์ฐ๋ฉด ๋๋ค. ๊ฐ์ ์ฑ์ธ๋๋ ์ ํ์์ ์ด์ฉํด์ ์ฑ์ฐ๊ณ ๊ฐ์ ์ฑ์ด 2์ฐจ์๋ฐฐ์ด์์ ๋ง์ง๋ง ํ์ ๊ฐ๋ค ์ค์ n๋ฏธ๋ง์ด๋ฉด์ ๊ฐ์ฅ ์์ ๊ฐ์ return ํ๋ฉด ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค.
2์ฐจ์๋ฐฐ์ด์ ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ค๊ณํ๋ค. ์ดํด๋ฅผ ๋๊ธฐ์ํด ๋ฌธ์ ์์ ์ฃผ์ด์ง Test case๋ฅผ ์ ์ฉํ์ฌ 2์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค์ด ๋ณด์๋ค. ( info = [[1,2],[2,3],[2,1]], n=4, m=4 )
์์ ๊ฐ์ 2์ฐจ์ ๋ฐฐ์ด์ ์ด์ฉํ๋ฉด b์ ํ์ ๊ฐฏ์๊ฐ m์ ๋์ด๊ฐ๋ ๊ฒฝ์ฐ๋ ์๊ธฐ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ a์กฐ๊ฑด๋ง์ ๊ณ ๋ คํ๋ฉด ๋๋ค.
2์ฐจ์ ๋ฐฐ์ด ์ค๊ณ๋ ์์ ๊ฐ์ด ์งํํ๊ณ ์ ํ์์ ์๋์ ๊ฐ๋ค.
- ์๋์์ ๋งํ๋ `aScore`, `bScore`๋ ๊ฐ๊ฐ info[r-1]๋ฅผ a๊ฐ ํ์ณค์๋ ํ์ ๊ฐฏ์, b๊ฐ ํ์ณค์๋ ํ์ ๊ฐฏ์๋ฅผ ์๋ฏธํ๋ค.
- dp[r-1][c] ์์ a ๋ฅผ ์ ํํ์ ๋ => dp[r][c] = Math.min(dp[r][c-1] + aScore, dp[r][c] )
- dp[r-1][c] ์์ b ๋ฅผ ์ ํํ์ ๋ => dp[r][c+bScore] = Math.min(dp[r-1][c], dp[r][c+bScore] )
2์ฐจ์๋ฐฐ์ด๊ณผ ์ ํ์์ ๊ณ ๋ คํ์ฌ ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ๊ตฌํํ ์ ์์๋ค.
function solution(info, n, m) {
let dp = Array.from({ length: info.length + 1 }, () => {
return Array(m).fill(Infinity);
});
dp[0][0] = 0;
for (let r = 1; r <= info.length; r++) {
let [aScore, bScore] = info[r - 1];
for (let c = 0; c < m; c++) {
dp[r][c] = Math.min(dp[r - 1][c] + aScore, dp[r][c]);
if (c + bScore < m) {
dp[r][c + bScore] = Math.min(dp[r - 1][c], dp[r][c + bScore]);
}
}
}
let min = Infinity;
dp[info.length].forEach((v) => {
if (v < n) {
min = Math.min(min, v);
}
});
return min === Infinity ? -1 : min;
}
'๐Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก๊ทธ๋๋จธ์ค[JS] > ํ๋ฐฐ ์์ ๊บผ๋ด๊ธฐ (0) | 2025.02.25 |
---|---|
ํ๋ก๊ทธ๋๋จธ์ค[JS] > ์ ์ฐ๊ทผ๋ฌด์ (0) | 2025.02.23 |
๋ฐฑ์ค[JS] > 1920๋ฒ ์ ์ฐพ๊ธฐ (0) | 2025.02.19 |
ํ๋ก๊ทธ๋๋จธ์ค[JS] > ์ง๊ฒ์ฐจ์ ํฌ๋ ์ธ (0) | 2025.02.16 |
ํ๋ก๊ทธ๋๋จธ[JS] > ์๋ฒ ์ฆ์ค ํ์ (1) | 2025.02.16 |