๐Ÿ“– [๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด] Q.2839 ์„คํƒ•๊ณต์žฅ ๋ฌธ์ œ ํ’€์ด - ๋™์ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹

๐Ÿ“– ๋ฌธ์ œ

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

์ƒ๊ทผ์ด๋Š” ์š”์ฆ˜ ์„คํƒ•๊ณต์žฅ์—์„œ ์„คํƒ•์„ ๋ฐฐ๋‹ฌํ•˜๊ณ  ์žˆ๋‹ค. ์ƒ๊ทผ์ด๋Š” ์ง€๊ธˆ ์‚ฌํƒ•๊ฐ€๊ฒŒ์— ์„คํƒ•์„ ์ •ํ™•ํ•˜๊ฒŒ Nํ‚ฌ๋กœ๊ทธ๋žจ์„ ๋ฐฐ๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.

์„คํƒ•๊ณต์žฅ์—์„œ ๋งŒ๋“œ๋Š” ์„คํƒ•์€ ๋ด‰์ง€์— ๋‹ด๊ฒจ์ ธ ์žˆ๋‹ค. ๋ด‰์ง€๋Š” 3ํ‚ฌ๋กœ๊ทธ๋žจ ๋ด‰์ง€์™€ 5ํ‚ฌ๋กœ๊ทธ๋žจ ๋ด‰์ง€๊ฐ€ ์žˆ๋‹ค.

์ƒ๊ทผ์ด๋Š” ๊ท€์ฐฎ๊ธฐ ๋•Œ๋ฌธ์—, ์ตœ๋Œ€ํ•œ ์ ์€ ๋ด‰์ง€๋ฅผ ๋“ค๊ณ  ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 18ํ‚ฌ๋กœ๊ทธ๋žจ ์„คํƒ•์„ ๋ฐฐ๋‹ฌํ•ด์•ผ ํ•  ๋•Œ,

3ํ‚ฌ๋กœ๊ทธ๋žจ ๋ด‰์ง€ 6๊ฐœ๋ฅผ ๊ฐ€์ ธ๊ฐ€๋„ ๋˜์ง€๋งŒ, 5ํ‚ฌ๋กœ๊ทธ๋žจ 3๊ฐœ์™€ 3ํ‚ฌ๋กœ๊ทธ๋žจ 1๊ฐœ๋ฅผ ๋ฐฐ๋‹ฌํ•˜๋ฉด, ๋” ์ ์€ ๊ฐœ์ˆ˜์˜ ๋ด‰์ง€๋ฅผ ๋ฐฐ๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒ๊ทผ์ด๊ฐ€ ์„คํƒ•์„ ์ •ํ™•ํ•˜๊ฒŒ Nํ‚ฌ๋กœ๊ทธ๋žจ ๋ฐฐ๋‹ฌํ•ด์•ผ ํ•  ๋•Œ, ๋ด‰์ง€ ๋ช‡ ๊ฐœ๋ฅผ ๊ฐ€์ ธ๊ฐ€๋ฉด ๋˜๋Š”์ง€ ๊ทธ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๐Ÿ” ์ ‘๊ทผ๋ฒ•

BOJ Q.2839 ์„คํƒ•๊ณต์žฅ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
   
๋™์ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ๋„ ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ์—

์ด๋ฒˆ์—๋Š” ๋™์ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ํ’€์ด ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Nํ‚ฌ๋กœ๊ทธ๋žจ๊นŒ์ง€ ๋ชจ๋‘ MAX ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.

i๋ฌด๊ฒŒ๊นŒ์ง€์˜ ๋ด‰์ง€ ๊ฐœ์ˆ˜๋ฅผ ์ œ์ผ ์ ๊ฒŒ ํ•ด์•ผํ•˜๋ฏ€๋กœ

i-3๊นŒ์ง€์˜ ๋ด‰์ง€ ๊ฐœ์ˆ˜ ์™€ i-5๊นŒ์ง€์˜ ๋ด‰์ง€ ๊ฐœ์ˆ˜ ์ค‘ 

๋” ์ ์€ ๋ด‰์ง€ ๊ฐœ์ˆ˜์— 3kg ์งœ๋ฆฌ ๋˜๋Š” 5kg์งœ๋ฆฌ ๋ด‰์ง€ ํ•˜๋‚˜๋ฅผ

์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

d[i] = MIN (d[i-3],d[i-5]  +1

i-3 , i-5 ๋ชจ๋‘ MAX ๊ฐ’์ด๋ผ๋ฉด ๋ถˆ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค.

d[i]์— 

MAX๋กœ ๋‚จ์•„์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ์ด๊ณ 

๊ทธ ์™ธ๋Š” ๊ฐ€๋Šฅํ•œ ์ œ์ผ ์ ์€ ๋ด‰์ง€ ๊ฐœ์ˆ˜๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ป ์ฝ”๋“œ

package problem.dynamic;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main_2839 {

    static int N;
    static int d[];
    static final int MAX = 5001;

    public static void main(String[] args) throws IOException {
        input();
        int result = solve();
        if(result==MAX){
            result= -1;
        }
        System.out.println(result);
    }

    public static int solve(){
        for(int i=0; i<=N; i++){
            d[i] = MAX;
        }
        d[3] = 1;
        d[5] = 1;
        for(int i=5; i<=N; i++){
            if(d[i-3]== MAX && d[i-5]== MAX) {
                continue;
            }
            d[i] = Math.min(d[i-3],d[i-5])+1;
        }
        return d[N];
    }

    public static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        d = new int[MAX];
        br.close();
    }

}

Written on December 8, 2020