Algorithm๐Ÿฅ‡

11052.์นด๋“œ๊ตฌ๋งคํ•˜๊ธฐ

hae02y 2023. 11. 1. 00:49
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

์š”์ฆ˜ ๋ฏผ๊ทœ๋„ค ๋™๋„ค์—์„œ๋Š” ์Šคํƒ€ํŠธ๋งํฌ์—์„œ ๋งŒ๋“  PS์นด๋“œ๋ฅผ ๋ชจ์œผ๋Š” ๊ฒƒ์ด ์œ ํ–‰์ด๋‹ค.

PS์นด๋“œ๋Š” PS(Problem Solving)๋ถ„์•ผ์—์„œ ์œ ๋ช…ํ•œ ์‚ฌ๋žŒ๋“ค์˜ ์•„์ด๋””์™€ ์–ผ๊ตด์ด ์ ํ˜€์žˆ๋Š” ์นด๋“œ์ด๋‹ค. ๊ฐ๊ฐ์˜ ์นด๋“œ์—๋Š” ๋“ฑ๊ธ‰์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒ‰์ด ์น ํ•ด์ ธ ์žˆ๊ณ , ๋‹ค์Œ๊ณผ ๊ฐ™์ด 8๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • ์ „์„ค์นด๋“œ
  • ๋ ˆ๋“œ์นด๋“œ
  • ์˜ค๋ Œ์ง€์นด๋“œ
  • ํผํ”Œ์นด๋“œ
  • ๋ธ”๋ฃจ์นด๋“œ
  • ์ฒญ๋ก์นด๋“œ
  • ๊ทธ๋ฆฐ์นด๋“œ
  • ๊ทธ๋ ˆ์ด์นด๋“œ

์นด๋“œ๋Š” ์นด๋“œํŒฉ์˜ ํ˜•ํƒœ๋กœ๋งŒ ๊ตฌ๋งคํ•  ์ˆ˜ ์žˆ๊ณ , ์นด๋“œํŒฉ์˜ ์ข…๋ฅ˜๋Š” ์นด๋“œ 1๊ฐœ๊ฐ€ ํฌํ•จ๋œ ์นด๋“œํŒฉ, ์นด๋“œ 2๊ฐœ๊ฐ€ ํฌํ•จ๋œ ์นด๋“œํŒฉ, ... ์นด๋“œ N๊ฐœ๊ฐ€ ํฌํ•จ๋œ ์นด๋“œํŒฉ๊ณผ ๊ฐ™์ด ์ด N๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.

๋ฏผ๊ทœ๋Š” ์นด๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์€ ํŒฉ์ด๋”๋ผ๋„ ๊ฐ€๊ฒฉ์ด ๋น„์‹ธ๋ฉด ๋†’์€ ๋“ฑ๊ธ‰์˜ ์นด๋“œ๊ฐ€ ๋งŽ์ด ๋“ค์–ด์žˆ์„ ๊ฒƒ์ด๋ผ๋Š” ๋ฏธ์‹ ์„ ๋ฏฟ๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋ฏผ๊ทœ๋Š” ๋ˆ์„ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ์ง€๋ถˆํ•ด์„œ ์นด๋“œ N๊ฐœ ๊ตฌ๋งคํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์นด๋“œ๊ฐ€ i๊ฐœ ํฌํ•จ๋œ ์นด๋“œํŒฉ์˜ ๊ฐ€๊ฒฉ์€ Pi์›์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์นด๋“œํŒฉ์ด ์ด 4๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๊ณ , P1 = 1, P2 = 5, P3 = 6, P4 = 7์ธ ๊ฒฝ์šฐ์— ๋ฏผ๊ทœ๊ฐ€ ์นด๋“œ 4๊ฐœ๋ฅผ ๊ฐ–๊ธฐ ์œ„ํ•ด ์ง€๋ถˆํ•ด์•ผ ํ•˜๋Š” ๊ธˆ์•ก์˜ ์ตœ๋Œ“๊ฐ’์€ 10์›์ด๋‹ค. 2๊ฐœ ๋“ค์–ด์žˆ๋Š” ์นด๋“œํŒฉ์„ 2๋ฒˆ ์‚ฌ๋ฉด ๋œ๋‹ค.

P1 = 5, P2 = 2, P3 = 8, P4 = 10์ธ ๊ฒฝ์šฐ์—๋Š” ์นด๋“œ๊ฐ€ 1๊ฐœ ๋“ค์–ด์žˆ๋Š” ์นด๋“œํŒฉ์„ 4๋ฒˆ ์‚ฌ๋ฉด 20์›์ด๊ณ , ์ด ๊ฒฝ์šฐ๊ฐ€ ๋ฏผ๊ทœ๊ฐ€ ์ง€๋ถˆํ•ด์•ผ ํ•˜๋Š” ๊ธˆ์•ก์˜ ์ตœ๋Œ“๊ฐ’์ด๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, P1 = 3, P2 = 5, P3 = 15, P4 = 16์ธ ๊ฒฝ์šฐ์—๋Š” 3๊ฐœ ๋“ค์–ด์žˆ๋Š” ์นด๋“œํŒฉ๊ณผ 1๊ฐœ ๋“ค์–ด์žˆ๋Š” ์นด๋“œํŒฉ์„ ๊ตฌ๋งคํ•ด 18์›์„ ์ง€๋ถˆํ•˜๋Š” ๊ฒƒ์ด ์ตœ๋Œ“๊ฐ’์ด๋‹ค.

์นด๋“œ ํŒฉ์˜ ๊ฐ€๊ฒฉ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, N๊ฐœ์˜ ์นด๋“œ๋ฅผ ๊ตฌ๋งคํ•˜๊ธฐ ์œ„ํ•ด ๋ฏผ๊ทœ๊ฐ€ ์ง€๋ถˆํ•ด์•ผ ํ•˜๋Š” ๊ธˆ์•ก์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. N๊ฐœ๋ณด๋‹ค ๋งŽ์€ ๊ฐœ์ˆ˜์˜ ์นด๋“œ๋ฅผ ์‚ฐ ๋‹ค์Œ, ๋‚˜๋จธ์ง€ ์นด๋“œ๋ฅผ ๋ฒ„๋ ค์„œ N๊ฐœ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰, ๊ตฌ๋งคํ•œ ์นด๋“œํŒฉ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์นด๋“œ ๊ฐœ์ˆ˜์˜ ํ•ฉ์€ N๊ณผ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

## ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋ฏผ๊ทœ๊ฐ€ ๊ตฌ๋งคํ•˜๋ ค๊ณ  ํ•˜๋Š” ์นด๋“œ์˜ ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 1,000)

๋‘˜์งธ ์ค„์—๋Š” Pi๊ฐ€ P1๋ถ€ํ„ฐ PN๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Pi ≤ 10,000)

## ์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋ฏผ๊ทœ๊ฐ€ ์นด๋“œ N๊ฐœ๋ฅผ ๊ฐ–๊ธฐ ์œ„ํ•ด ์ง€๋ถˆํ•ด์•ผ ํ•˜๋Š” ๊ธˆ์•ก์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ œ์ถœ ์ •๋‹ต ๋งžํžŒ ์‚ฌ๋žŒ ์ •๋‹ต ๋น„์œจ
1 ์ดˆ 256 MB 48155 29570 22234 61.276%

https://www.acmicpc.net/problem/11052

ํ’€์ด

์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ๋ฆ„

์ด๋ฌธ์ œ๋Š” DP๋กœ ํ‘ธ๋Š” ๋ฌธ์ œ์ด๋‹ค. ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์˜ˆ์‹œ๋กœ ํ•œ๋ฒˆ ์ดํ•ดํ•ด๋ณด์ž.

์นด๋“œ์˜ ๊ฐœ์ˆ˜๋Š” N๊ฐœ์ด๊ณ , N๊ฐœ์˜ ์นด๋“œ๋ฅผ ๊ฐ–๊ธฐ์œ„ํ•ด ์ง€๋ถˆํ•˜๋Š” ๊ธˆ์•ก์˜ ์ตœ๋Œ€๊ฐ’์„ dp[n] ์ด๋ผ๊ณ  ํ•ด๋ณด์ž.

(P1=1) (P2=5) (P3=6) (P4=7)

P1์˜ ๋œป์€ 1์žฅ์ด ๋“ค์–ด์žˆ๋Š” ์นด๋“œํŒฉ(P1)์˜ ๊ฐ€๊ฒฉ์ด 1์ด๋ผ๋Š” ๋œป์ด๊ณ , ์ด๊ฒƒ์„ ์˜ˆ์‹œ๋กœ ๋“ค์–ด๋ณด์ž.

์นด๋“œ 1๊ฐœ๋ฅผ ๊ฐ–๋Š”๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒฝ์šฐ๋Š” P1์„ ๊ณ ๋ฅด๋Š” ๊ฒฝ์šฐ ํ•œ๊ฐœ์ผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด,
dp[1] = P1 ์ด ๋ ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ ์นด๋“œ 2์žฅ์„ ๊ฐ–๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๊ทธ๋Ÿผ 2๊ฐœ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ์นด๋“œํŒฉ์„ ๊ตฌ๋งคํ•˜๊ฑฐ๋‚˜, 1๊ฐœ์งœ๋ฆฌ ์นด๋“œํŒฉ์„ 2๋ฒˆ ์‚ฌ๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ์ด๋•Œ ์ง€๋ถˆ๊ธˆ์•ก์€ ์ตœ๋Œ€๊ฐ’์ด ๋˜์•ผํ•˜๋ฏ€๋กœ,

dp[2] = Max(P[2], dp[1] + dp[1])

์ด ๋ ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ์œผ๋กœ 3์žฅ์„ ๊ฐ–๋Š” ๊ฒฝ์šฐ์˜ ์ง€๋ถˆ๊ธˆ์•ก์˜ ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•ด๋ณด์ž.

  • 1๊ฐœ์งœ๋ฆฌ ์นด๋“œํŒฉ 3๊ฐœ
  • 2๊ฐœ์งœ๋ฆฌ ์นด๋“œํŒฉ 1๊ฐœ, 1๊ฐœ์งœ๋ฆฌ ์นด๋“œํŒฉ 1๊ฐœ
  • 3๊ฐœ์งœ๋ฆฌ ์นด๋“œํŒฉ 1๊ฐœ

์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ๋ ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ณด๋ฉด,

dp[3] = Max(P[3], dp[2] + dp[1] , dp[1] x 3)

์ด ๋ ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ์œผ๋กœ 4์žฅ์„ ๊ฐ–๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

  • 1๊ฐœ์งœ๋ฆฌ ์นด๋“œํŒฉ 4๊ฐœ
  • 2๊ฐœ์งœ๋ฆฌ ์นด๋“œํŒฉ 2๊ฐœ
  • 3๊ฐœ์งœ๋ฆฌ ์นด๋“œํŒฉ 1๊ฐœ, 1๊ฐœ์งœ๋ฆฌ ์นด๋“œํŒฉ 1๊ฐœ
  • 4๊ฐœ์งœ๋ฆฌ ์นด๋“œํŒฉ 1๊ฐœ

์ด๋ ‡๊ฒŒ 4๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ๋ ๊ฒƒ์ด๊ณ , ์‹์„ ๋‚˜ํƒ€๋‚ด๋ฉด

dp[4] = Max(P[4], dp[3] + dp[1], dp[2] x 2, dp[1] x 4)

์˜ˆ๋ฅผ ๋“ค์–ด n = 4์ผ๋•Œ,
dp[4] =

  • ์นด๋“œ 0๊ฐœ๋ฅผ ์‚ฌ๊ธฐ์œ„ํ•œ ์ตœ๋Œ€ ๊ธˆ์•ก(dp[0]) + 4๊ฐœ์งœ๋ฆฌ ์นด๋“œํŒฉ ๊ฐ’(P4)
  • ์นด๋“œ 1๊ฐœ๋ฅผ ์‚ฌ๊ธฐ์œ„ํ•œ ์ตœ๋Œ€ ๊ธˆ์•ก(dp[1]) + 3๊ฐœ์งœ๋ฆฌ ์นด๋“œํŒฉ ๊ฐ’(P3)
  • ์นด๋“œ 2๊ฐœ๋ฅผ ์‚ฌ๊ธฐ์œ„ํ•œ ์ตœ๋Œ€ ๊ธˆ์•ก(dp[2]) + 2๊ฐœ์งœ๋ฆฌ ์นด๋“œํŒฉ ๊ฐ’(P2)
  • ์นด๋“œ 3๊ฐœ๋ฅผ ์‚ฌ๊ธฐ์œ„ํ•œ ์ตœ๋Œ€ ๊ธˆ์•ก(dp[3]) + 1๊ฐœ์งœ๋ฆฌ ์นด๋“œํŒฉ ๊ฐ’(P1)

์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋ณด๋ฉด

for(int i=1; i<=n; i++){
    for(int j=1; j<=i; j++){
        dp[i] = Max(dp[i], dp[i-j] + P[j]);
    }
}

ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์€ ์ž‘์„ฑ๋์œผ๋‹ˆ ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž. ๋‚˜๋Š” Scanner + for๋ฌธ(bottom up) ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•˜์˜€๋‹ค.

์ฝ”๋“œ

import java.util.Scanner;  

public class ์นด๋“œ๊ตฌ๋งคํ•˜๊ธฐ {  

    public static void main(String[] args) {  

        Scanner sc = new Scanner(System.in);  

        int n = sc.nextInt(); //๊ตฌ๋งคํ•˜๋ ค๋Š” ์นด๋“œ์˜ ๊ฐœ์ˆ˜  

        int [] p = new int[n + 1]; //์นด๋“œ๋งˆ๋‹ค ๊ฐ€๊ฒฉ์„ ์ •ํ•œ๋‹ค.  

        for(int i=1; i<=n; i++){  
            p[i] = sc.nextInt();  
        }  

        int[] dp = new int[n + 1];  

        for(int i=1; i<=n; i++){  
            for(int j=1; j<=i; j++){  
                dp[i] = Math.max(dp[i], dp[i-j] + p[j]);  
            }  
        }  

        System.out.println(dp[n]);  
        sc.close();  
    }  

}
๋ฐ˜์‘ํ˜•