๐ฉโ๐ป BOJ_14501_ํด์ฌ
๐ฌ ํด์ฌ์ ์ผ์์ ๋ด์, ๋ฌธ์ ๋ฅผ ํ์์ง๋ง DP๋ ํ์ด๋ ํ์ด๋ ์ด๋ ค์ด ๊ฒ์ ๋๊ผ์ต๋๋ค. ํ๋ฃจ ๋ด๋ด ์ก๊ณ ์์ด๋ ์ ๋์ด์ ํด์ค์ ๋ณด๊ณ ์ดํดํ๋ ์์ผ๋ก ํด๊ฒฐํ์ต๋๋ค. ๋ค์์ ์ค๋ ฅ์ ๋ ์์ ์ค์ค๋ก ํ์ด๋ณด๊ณ ์ถ์ต๋๋ค.
๐ ๋ฌธ์
์๋ด์์ผ๋ก ์ผํ๊ณ ์๋ ๋ฐฑ์ค์ด๋ ํด์ฌ๋ฅผ ํ๋ ค๊ณ ํ๋ค.
์ค๋๋ถํฐ N+1์ผ์งธ ๋๋ ๋ ํด์ฌ๋ฅผ ํ๊ธฐ ์ํด์, ๋จ์ N์ผ ๋์ ์ต๋ํ ๋ง์ ์๋ด์ ํ๋ ค๊ณ ํ๋ค.
์๋ด์ ์ ์ ํ ํ์ ๋, ๋ฐฑ์ค์ด๊ฐ ์ป์ ์ ์๋ ์ต๋ ์์ต์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐ก ํ์ด ๋ฐฉ๋ฒ
-
์ด๋ฌํ ์ ํ์ DP ๋ฌธ์ ๋ ๋ค์์๋ถํฐ ํ์ธํ๋ ๊ฒ์ด ํธํ๋ค๊ณ ์ด๋์ ๊ฐ ๋ค์์ต๋๋ค. N๋ถํฐ 1๊น์ง ๋ค์์ ์์ผ๋ก ์ต์ ๋น์ฉ(์ ์ผ ํฐ ๊ฐ) ์ ๋์ ํด ์ ์ฅํด์ค๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์์์ ์ต๋๊ฐ์ด ์ ์ฅ๋ฉ๋๋ค.
-
์ฐ์ , ๊ฐ์ ์ ์ฅํ๋ ๋ฐฐ์ด์ 3๊ฐ ๋ง๋ญ๋๋ค.
โ๏ธ 1์ผ-N์ผ๊น์ง๋ก ๋ฐฐ์ด ์์๋ฅผ ๋ง์ถ๊ณ ์ถ์ดint xxx = new int[N+1];
๋ก ์ ์ธํฉ๋๋ค.
1) ์์๋๋ ์๊ฐ : time[]
2) ์ป์ ์ ์๋ ๋น์ฉ : money[]
3) ์ต์ ๋น์ฉ์ ๋ฉ๋ชจ : memo[]
โ๏ธ ๋ฉ๋ชจ์ ๊ฒฝ์ฐ๋ ํด์ฌ ์ผ์ด N+1์์ ๊ณ ๋ คํด ๋ฐฐ์ด ํฌ๊ธฐ๋ฅผ +1 ํด์ค๋๋ค.
โ๏ธint memo[] = new int[N+2]; ๋ก ์ฒ์์ ์ด๊ธฐํ๋ฅผ ํ๋ ๋ชจ๋ ๊ฐ์ 0์ ๋๋ค.
-
time[N]์ N์ผ์ ์์ ์ ์์๋๋ ์๊ฐ์ ๋๋ค. ํด์ฌ ์ ๊น์ง ์ด์ฌํ ์ผ์ ํด์ผํ๊ธฐ ๋๋ฌธ์ ํด์ฌ ์ ์ ๋๋ด๋ ๊ฒฝ์ฐ / ํด์ฌ ์ ๊น์ง ๋๋ด์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ก ๋๋ ์ ์์ต๋๋ค.
-
money[N]์ ๋ง ๊ทธ๋๋ก N์ผ์ ์์ํ ์ผ์ ๋๋ผ ๊ฒฝ์ฐ ๋ฐ์ ์ ์๋ ๋ณด์์ ๋๋ค.
1๏ธโฃ ํด์ฌ ์ ๊น์ง ๋ชป ๋๋ด๋ ๊ฒฝ์ฐ
๐ค ์๋ฅผ ๋ค์ด ํด์ฌ ์์ ์ผ์ 8์ผ(N+1)์ ๋๋ค. 7์ผ(N)์ ์์ํ ๋, 2์ผ์ด ๊ฑธ๋ฆฐ๋ค๊ณ ํ๋ฉด ํด์ฌ ๋ ์ง์ธ 8์ผ ๋ณด๋ค ํ์ธ 9์ผ์ ๋๋๋ ์์ ์ ํ ์ ์์ต๋๋ค.
- memo[N+1]์ ๊ฐ์ธ 0์ memo[N]์ ์ ์ฅํด์ค๋๋ค.
- for๋ฌธ ์์์ ๋์๊ฐ๋ ์์ผ๋ก ํํ ์,
memo[i] = memo[i+1]
๊ฐ ๋๊ฒ ์ต๋๋ค.
2๏ธโฃ ํด์ฌ ์ ์ ๋๋ด๋ ๊ฒฝ์ฐ
๐ค ์๋ฅผ ๋ค์ด ํด์ฌ ์์ ์ผ์ 8์ผ(N+1)์ ๋๋ค. 5์ผ(N-3)์ ์์ํ ๋, 2์ผ์ด ๊ฑธ๋ฆฐ๋ค๊ณ ํ๋ฉด ํด์ฌ ๋ ์ง์ธ 8์ผ ๋ณด๋ค ์ ์ธ 7์ผ์ ๋๋๋ ์์ ์ ํ ์ ์์ต๋๋ค.
๋ค์์ ๋์ ํด์ ๋ณด์๋ฅผ ์ ์ฅํด์๊ธฐ ๋๋ฌธ์ memo[6]์ ์ ์ฅ๋ ๊ฐ์ 6, 7์ผ์ ์์ํด์ ์ป์ ๋ณด์์ ๊ฐ์ ํฉ์ ๋๋ค. ๋ ๋ค ํด์ฌ ์ ์ ๋๋ด์ง ๋ชปํ๋ค๊ณ ๊ฐ์ ํ๋ฉด memo[i+1]์ 0์ ๋๋ค.
6์ผ์ ์์ํด ์ป์ ์ ์๋ ๋ณด์๋ money[5]์ memo[7]์ ๋ํ ๊ฐ์ ๋๋ค.
5์ผ์ ์์ํ๋ฉด 5, 6์ผ์ ์์ํด 7์ผ์ ์์์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค. (๊ทธ๋ฌ๋ 7์ผ์ ์์ํ๋ฉด ํด์ฌ ์ ์ ๋๋ด์ง ๋ชปํ๋ memo[7]์ 0์ ๋๋ค.)
- ๋์ ๋ ๊ฐ(memo[i+1])๊ณผ ํ์ฌ ์์ํ์ ๋ ์ป์ ์ ์๋ ๋ณด์๋ฅผ ๋น๊ตํด ํฐ ๊ฐ์ memo[i]์ ์ ์ฅํฉ๋๋ค.
- for๋ฌธ ์์์ ๋์๊ฐ๋ ์์ผ๋ก ํํ ์,
memo[i] = Math.max(memo[i+1], memo[i+time[i]]+money[i]);
๊ฐ ๋๊ฒ ์ต๋๋ค.
๐ ์ต์ข ์ ์ผ๋ก memo[1]์ ์ ์ฅ๋ ๊ฐ์ด ์ต๋๋ก ๋ฒ ์ ์๋ ๋ณด์๊ฐ ๋ฉ๋๋ค.
๐ฅ ์ฝ๋
import java.util.Scanner;
public class ํด์ฌ {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
// ํด์ฌ๊น์ง ๋จ์ ์ผ์ : ํด์ฌ๋ N+1
int N = sc.nextInt();
// ๊ฑธ๋ฆฌ๋ ์๊ฐ, ๋ณด์, ๋์ ๋ณด์ ๋ฉ๋ชจ
int time[] = new int[N+1];
int money[] = new int[N+1];
int memo[] = new int[N+2];
for(int i = 1; i < N+1; i++) {
time[i] = sc.nextInt();
money[i] = sc.nextInt();
}
// ์ต๋ ๋ณด์ ๊ณ์ฐ
for(int i = N; i > 0; i--) {
int addTime = i + time[i];
// ํด์ฌ ํ์ ๋๋๋ ๊ฒฝ์ฐ
if(addTime > N + 1) {
memo[i] = memo[i+1];
}
// ํด์ฌ ์ ์ ๋๋๋ ๊ฒฝ์ฐ
else {
memo[i] = Math.max(memo[i+1], memo[addTime]+money[i]);
}
}
// ์ต๋ ๋์ ๋ณด์
System.out.println(memo[1]);
}
}
โญ๏ธ ๋๋ ์
- ์ต๋ํ ํ์ด์ ์ ๋ฆฌ๋ฅผ ํด๋ณด์์ผ๋ ์์ง ๋ฏธ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ฉโ๐ป BOJ_14501_ํด์ฌ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@hyemz/BOJ14501์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค