๋ฌธ์ ๋งํฌ: https://school.programmers.co.kr/learn/courses/30/lessons/214289
ํ์ด
์ด์ฉ๋ค๋ณด๋ ๋! DP ๋ฌธ์ ๋ฅผ ์ก์๋ค. DP ์ข ๊ทธ๋ง ์ก๊ณ ์ถ์๋ฐ ๊ณ ๋ฅด๋ ๋ฌธ์ ๋ง๋ค DP...๐ฅน
dp[i][j]
= i๋ถ์ผ ๋ j๋๋ฅผ ์ ์งํ๊ธฐ ์ํ ์ต์ ์๋น์ ๋ ฅ์ผ๋ก ๋๊ณ ํ์ด๋๊ฐ๋ฉด ๋๋ค.
ํ์ฌ ์๊ฐ์ด i, ํ์ฌ ์จ๋๊ฐ j์ผ ๋ ๊ณ ๋ฅผ ์ ์๋ ์ ํ์ง๋ ๋ค์ 4๊ฐ์ง๊ฐ ์๋ค.
1. ์์ด์ปจ ๋๊ธฐ
2. ์จ๋ 1๋ ์ฌ๋ฆฌ๊ธฐ
3. ์จ๋ 1๋ ๋ด๋ฆฌ๊ธฐ
4. ์จ๋ ์ ์งํ๊ธฐ
๋ฌธ์ ๋ฅผ ์ ์ฝ์ด๋ณด๋ฉด ์๊ฒ ์ง๋ง ํฌ๋ง์จ๋๋ ์๋ฏธ๊ฐ ์๋ค. ํ์ฌ ์จ๋๊ฐ 26๋๋ผ๋ฉด, ํฌ๋ง์จ๋๋ฅผ 40๋๋ก ์ค์ ํ๋ 30๋๋ก ์ค์ ํ๋ ๋๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค. ์ค์ํ ๊ฑด ์จ๋๋ฅผ ์ฌ๋ฆด์ง ๋ด๋ฆด์ง์ด๋ค.
์จ๋ ๋ฒ์ ๋ณด์
๋ฌธ์ ์์ ์ฃผ์ด์ง๋ ์จ๋ ๋ฒ์๋ -10๋ ์ด์, 40๋ ์ดํ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ฐ๋ฆฌ๋ ์จ๋๋ฅผ dp๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ก ์ฐ๊ณ ์๋ค. ๋ฐ๋ผ์ ์ฃผ์ด์ง๋ ์จ๋(temperature, t1, t2)์ 10์ ๋ํด์ฃผ์ด์ผ ํ๋ค.
int MAX_TEMP = 40, MIN_TEMP = -10, RANGE = MAX_TEMP-MIN_TEMP;
temperature-=MIN_TEMP;
t1-=MIN_TEMP;
t2-=MIN_TEMP;
์ ํ์ ์ธ์ฐ๊ธฐ
๋ฌธ์ ์์ ์ด๊ธฐ ์จ๋==์ค์ธ ์จ๋๋ผ๊ณ ํ์ผ๋ฏ๋ก, dp[0][temperature]=0
์ผ๋ก ๋๊ณ ์์ํ๋ค.
ํ์ฌ ์๊ฐ์ด i, ํ์ฌ ์จ๋๊ฐ j๋ผ๊ณ ๊ฐ์ ํ๊ณ dp[i][j]
๋ฅผ ์ด์ฉํด ์๊ฐ์ด i+1์ผ ๋์ ๊ฐ์ ๊ตฌํด๋ณด์.
(1) ์์ด์ปจ์ ๋๋ ๊ฒฝ์ฐ: 0์ ์๋ชจ
1. ํ์ฌ ์จ๋ < ์ค์ธ ์จ๋: 1๋ ์ฆ๊ฐ
dp[i+1][j+1] = Math.min( dp[i][j], dp[i+1][j+1] )
2. ํ์ฌ ์จ๋ > ์ค์ธ ์จ๋: 1๋ ๊ฐ์
dp[i+1][j-1] = Math.min( dp[i][j], dp[i+1][j-1] )
3. ํ์ฌ ์จ๋ == ์ค์ธ ์จ๋: ์จ๋ ๋ณํ X
dp[i+1][j] = Math.min( dp[i][j], dp[i+1][j] )
(2) ์จ๋๋ฅผ 1๋ ๋์ด๊ฑฐ๋ ๋ฎ์ถ๋ ๊ฒฝ์ฐ: a์ ์๋ชจ
์จ๋๋ฅผ 1๋ ๋์ด๋ ๊ฒฝ์ฐ: dp[i+1][j+1] = Math.min( dp[i][j]+a, dp[i+1][j+1] )
์จ๋๋ฅผ 1๋ ๋ฎ์ถ๋ ๊ฒฝ์ฐ: dp[i+1][j-1] = Math.min( dp[i][j]+a, dp[i+1][j-1] )
(3) ์จ๋๋ฅผ ์ ์งํ๋ ๊ฒฝ์ฐ: b์ ์๋ชจ
dp[i+1][j] = Math.min( dp[i][j]+b, dp[i+1][j] )
์ต์ ๋น์ฉ ๊ตฌํ๊ธฐ
onboard๋ฐฐ์ด์ ๋ง์ง๋ง ์ธ๋ฑ์ค๊ฐ N์ด๋ผ๊ณ ํ๋ฉด, ์ต์ ๋น์ฉ์ onboard[N]
๋ฐฐ์ด์ ์ต์๊ฐ์ด๋ค.
ํ์ง๋ง ๋ง์ง๋ง ์๊ฐ์ ์น๊ฐ์ด ํ์นํ๊ณ ์์๋ค๋ฉด, ํ์ฌ ์จ๋๊ฐ ์จ๋ ๋ฒ์๋ฅผ ์ด๊ณผํ๋ ๊ฒฝ์ฐ๋ ์ ์ธํ๊ณ ์ต์๊ฐ์ ๊ตฌํด์ผ ํ๋ค.
int answer = MAX;
for (int j=0; j<=RANGE; j++) {
if(onboard[onboard.length-1]==1 && (j<t1 || j>t2)) continue;
answer = Math.min(dp[onboard.length-1][j], answer);
}
์ ์ฒด ์ฝ๋
๋ถ๋น ์ต๋ ์๋น์ ๋ ฅ์ 100, ์ต๋ 1000๋ถ์ด ์ฃผ์ด์ง๋ฏ๋ก MAX๋ฅผ 1,000,001๋ก ์ค์ ํ๋ค.
import java.util.*;
class Solution {
int[][] dp;
int MAX = 1_000_001;
int MAX_TEMP = 40, MIN_TEMP = -10, RANGE = MAX_TEMP-MIN_TEMP;
public int solution(int temperature, int t1, int t2, int a, int b, int[] onboard) {
if(t1<=temperature && temperature<=t2) return 0;
temperature-=MIN_TEMP;
t1-=MIN_TEMP;
t2-=MIN_TEMP;
dp = new int[onboard.length][RANGE+1];
for (int i=0; i<dp.length; i++) {
Arrays.fill(dp[i], MAX);
}
dp[0][temperature] = 0;
for (int i=0; i<onboard.length-1; i++) {
for (int j=0; j<=RANGE; j++) {
// ์น๊ฐ์ด ํ์นํ๋๋ฐ ์จ๋ ๋ฒ์ ๋ฐ์ธ ๊ฒฝ์ฐ SKIP
if(onboard[i]==1 && (j<t1 || j>t2)) continue;
// 1. ์์ด์ปจ์ ๋๋ ๊ฒฝ์ฐ
int nextTemp = j;
if(j<temperature && j<RANGE) nextTemp = j+1;
else if(j>temperature && j>0) nextTemp = j-1;
dp[i+1][nextTemp] = Math.min(dp[i][j], dp[i+1][nextTemp]);
// 2. ํฌ๋ง์จ๋!=ํ์ฌ์จ๋
if(j>0) dp[i+1][j-1] = Math.min(dp[i][j]+a, dp[i+1][j-1]);
if(j<RANGE) dp[i+1][j+1] = Math.min(dp[i][j]+a, dp[i+1][j+1]);
// 3. ํฌ๋ง์จ๋==ํ์ฌ์จ๋
dp[i+1][j] = Math.min(dp[i][j]+b, dp[i+1][j]);
}
}
int answer = MAX;
for (int j=0; j<=RANGE; j++) {
if(onboard[onboard.length-1]==1 && (j<t1 || j>t2)) continue;
answer = Math.min(dp[onboard.length-1][j], answer);
}
return answer;
}
}
'๐๐ฅ๐ ๐จ๐ซ๐ข๐ญ๐ก๐ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ์๊ณผ ๋๋ (0) | 2023.09.07 |
---|---|
[๋ฐฑ์ค 5052] ์ ํ๋ฒํธ ๋ชฉ๋ก (0) | 2023.09.04 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์ฝ๋ฉ ํ ์คํธ ๊ณต๋ถ (0) | 2023.08.31 |
[๋ฐฑ์ค 10942] ํฐ๋ฆฐ๋๋กฌ? (0) | 2023.08.31 |
[๋ฐฑ์ค 6086] ์ต๋ ์ ๋ (0) | 2023.08.28 |