๋ฌธ์ ๋งํฌ: https://school.programmers.co.kr/learn/courses/30/lessons/118668
ํ์ด
๋์ถฉ ํ๊ณ ์ฌ๋ฐ์ด๋ณด์ฌ์ ๊ณจ๋๋๋ฐ ์ด์ฉ๋ค๋ณด๋ 2์ฐ์ DP ๋ฌธ์ ๋ฅผ ํ๊ฒ ๋์๋ค๐
์ด ๋ฌธ์ ์์๋ ํ์ฌ ์๊ณ ๋ ฅ
๊ณผ ํ์ฌ ์ฝ๋ฉ๋ ฅ
, ๊ทธ๋ฆฌ๊ณ ํ์ฌ ์๊ณ ๋ ฅ๊ณผ ํ์ฌ ์ฝ๋ฉ๋ ฅ๊น์ง ๋๋ฌํ๊ธฐ ์ํ ์ต๋จ ์๊ฐ
์ ์ ์ฅํด์ผ ํ๋ค.
๋ฐ๋ผ์ dp๋ฐฐ์ด์ dp[์๊ณ ๋ ฅ][์ฝ๋ฉ๋ ฅ] = ์ต๋จ ์๊ฐ
์ ํํ๊ฐ ๋๋ค.
DP ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ ์ด์ ๋, dp[์๊ณ ๋ ฅ][์ฝ๋ฉ๋ ฅ] = k
์ ๊ฐ์ ๋ค์์ ๋ค์ ์ฌํ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ค์ ์ ํ์์ ์ธ์๋ณด๋ฉด, ๋ค์ ๋ฌธ์ ์ ๋ต์ ๊ตฌํ ๋ ์ด์ ๋ฌธ์ ์ ๋ต k
๊ฐ ์ฌํ์ฉ๋๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
(1) ์ ํ์ ์ธ์ฐ๊ธฐ
ํ์ฌ ์๊ณ ๋ ฅ์ด i
, ํ์ฌ ์ฝ๋ฉ๋ ฅ์ด j
, dp[i][j] = k
๋ผ๊ณ ๊ฐ์ ํ๋ฉด ์๋์ ๊ฐ์ ์ ํ์์ ์ธ์ธ ์ ์๋ค.
// 1. ์๊ณ ๋ ฅ์ ๋์ด๋ ๊ฒฝ์ฐ: dp[i+1][j] = Math.min(k+1, dp[i+1][j])
// 2. ์ฝ๋ฉ๋ ฅ์ ๋์ด๋ ๊ฒฝ์ฐ: dp[i][j+1] = Math.min(k+1, dp[i][j+1])
// 3. k๋ฒ์งธ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ ๊ฒฝ์ฐ:
// dp[i+problems[k][2]][j+problems[k][3]] = Math.min(k+problems[k][4], dp[i+problems[k][2]][j+problems[k][3]])
i
,j
,k
์ ๋ํด 3์ค for๋ฌธ์ ๋๋ ค์ฃผ๋ฉด ๋๋ค.
(2) ์ด๊ธฐํ
๋ฌธ์ ์์ ์ฃผ์ด์ง๋ ์๊ณ ๋ ฅ๊ณผ ์ฝ๋ฉ๋ ฅ์ ๋ฒ์๋ ์ต๋ 150์ด๋ฏ๋ก, dp[i][k]
์ ๊ฐ์ ์ต๋ 300์ด๋ค.
๋ฐ๋ผ์ dp[0][0]
๋ถํฐ dp[alp][cop]
๊น์ง๋ 0์ผ๋ก, ๊ทธ ์ธ์๋ 300์ผ๋ก ์ด๊ธฐํํด์ฃผ๋ฉด ๋๋ค.
(3) ์์ธ ์ผ์ด์ค
1. ์ด๊ธฐ ์๊ณ ๋ ฅ๊ณผ ์ฝ๋ฉ๋ ฅ์ผ๋ก ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ ๊ฒฝ์ฐ
๋ฌธ์ ์์ ์๊ตฌํ๋ ์ต๋ ์๊ณ ๋ ฅ, ์ต๋ ์ฝ๋ฉ๋ ฅ์ ์ด๊ธฐ ์๊ณ ๋ ฅ, ์ด๊ธฐ ์ฝ๋ฉ๋ ฅ๊ณผ ๋น๊ตํ์ฌ, ์ด๊ธฐ๊ฐ์ด ํด ๊ฒฝ์ฐ ๋ฐ๋ก 0์ ๋ฆฌํดํ๋ฉด ๋๋ค.
2. ๋์ธ ์๊ณ ๋ ฅ, ์ฝ๋ฉ๋ ฅ์ด ์ต๋๊ฐ๋ณด๋ค ํฐ ๊ฒฝ์ฐ
์๋์ ๊ฐ์ด ์ธ๋ฑ์ค ๊ฒ์ฌ๋ฅผ ์งํํ๋ฉด ๋๋ค.
// maxAlp = Math.max(๋ฌธ์ ์์ ์๊ตฌํ๋ ์ต๋ ์๊ณ ๋ ฅ, ์ด๊ธฐ ์๊ณ ๋ ฅ);
// maxCop = Math.max(๋ฌธ์ ์์ ์๊ตฌํ๋ ์ต๋ ์ฝ๋ฉ๋ ฅ, ์ด๊ธฐ ์ฝ๋ฉ๋ ฅ);
int nextAlp = Math.min(maxAlp, i+problems[k][2]);
int nextCop = Math.min(maxCop, j+problems[k][3]);
dp[nextAlp][nextCop] = Math.min(dp[nextAlp][nextCop], dp[i][j]+problems[k][4]);
์ฃผ์ํ ์ ์, nextAlp
์ nextCop
์ ์ต๋ ๋ฒ์๋ฅผ 300์ด ์๋ maxAlp
, maxCop
๋ก ์ ํํด์ผ ํ๋ค๋ ์ ์ด๋ค.
maxAlp
์ maxCop
๊ฐ ๊ฐ๊ฐ 20์ด๊ณ , 1๋ฒ ๋ฌธ์ ๋ฅผ ํ์์ ๋ 2๋งํผ์ ์๊ฐ์ ๋ค์ฌ ์๊ณ ๋ ฅ 4, ์ฝ๋ฉ๋ ฅ 2๋ฅผ ์ป์ ์ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
(ํ ์ ์๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ์๋ค๊ณ ๊ฐ์ ํ๋ค.)
dp[17][19]=5
์ธ ์ํฉ์ด๋ผ๋ฉด, 1๋ฒ ๋ฌธ์ ๋ฅผ ํ๋ฉด ๋ฌธ์ ์์ ์๊ตฌํ๋ ๋ฅ๋ ฅ์น๋ฅผ ์ฑ์ธ ์ ์์ผ๋ฏ๋ก ๋ต์ 7์ด ๋์ด์ผ ํ๋ค.
ํ์ง๋ง ์ต๋ ๋ฒ์๋ฅผ 300์ผ๋ก ๋๋ฉด dp[21][21]
๋ง 7๋ก ๊ฐฑ์ ๋๊ณ , ์ฐ๋ฆฌ๊ฐ ๊ตฌํ๋ ๊ฐ์ธ dp[20][20]
์ ๊ฐฑ์ ๋์ง ์๋๋ค.
๋ฐ๋ผ์ dp[21][21]
๋์ dp[20][20]
์ด ๊ฐฑ์ ๋๋๋ก ํ๊ธฐ ์ํด, nextAlp
์ nextCop
์ ์ต๋ ๋ฒ์๋ฅผ maxAlp
, maxCop
๋ก ์ ํํ๋ ๊ฒ์ด๋ค.
์ ์ฒด ์ฝ๋
import java.util.*;
class Solution {
int[][] dp;
int MAX = 150;
int maxAlp=0, maxCop=0;
public int solution(int alp, int cop, int[][] problems) {
for(int i=0; i<problems.length; i++) {
maxAlp = Math.max(maxAlp, problems[i][0]);
maxCop = Math.max(maxCop, problems[i][1]);
}
if(alp>=maxAlp && cop>=maxCop) return 0;
dp = new int[MAX+1][MAX+1];
for(int i=0; i<dp.length; i++) {
Arrays.fill(dp[i], MAX*2);
}
for(int i=0; i<=alp; i++) {
for(int j=0; j<=cop; j++) {
dp[i][j] = 0;
}
}
for (int i=0; i<=MAX; i++) {
for (int j=0; j<=MAX; j++) {
for(int k=0; k<problems.length; k++) {
// 1. ์๊ณ ๋ ฅ ๋์ด๊ธฐ
if(i>0) {
dp[i][j] = Math.min(dp[i][j], dp[i-1][j]+1);
}
// 2. ์ฝ๋ฉ๋ ฅ ๋์ด๊ธฐ
if(j>0) {
dp[i][j] = Math.min(dp[i][j], dp[i][j-1]+1);
}
// 3. k๋ฒ์งธ ๋ฌธ์ ํ๊ธฐ
if(i>=problems[k][0]&&j>=problems[k][1]) {
int nextAlp = Math.min(maxAlp, i+problems[k][2]);
int nextCop = Math.min(maxCop, j+problems[k][3]);
dp[nextAlp][nextCop] = Math.min(dp[nextAlp][nextCop], dp[i][j]+problems[k][4]);
}
}
}
}
return dp[maxAlp][maxCop];
}
}
'๐๐ฅ๐ ๐จ๐ซ๐ข๐ญ๐ก๐ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 5052] ์ ํ๋ฒํธ ๋ชฉ๋ก (0) | 2023.09.04 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ์์ด์ปจ (0) | 2023.09.04 |
[๋ฐฑ์ค 10942] ํฐ๋ฆฐ๋๋กฌ? (0) | 2023.08.31 |
[๋ฐฑ์ค 6086] ์ต๋ ์ ๋ (0) | 2023.08.28 |
[๋ฐฑ์ค 1062] ๊ฐ๋ฅด์นจ (0) | 2023.08.28 |