๐Ÿ‘ฉโ€๐Ÿ’ป 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]);
	}

}

โญ๏ธ ๋Š๋‚€ ์ 

  • ์ตœ๋Œ€ํ•œ ํ’€์–ด์„œ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด์•˜์œผ๋‚˜ ์•„์ง ๋ฏธ์ˆ™ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ