๐Ÿ’ซAlgorithm

๋™์ ๊ณ„ํš๋ฒ• DP ๊ตฌํ˜„๋ฐฉ๋ฒ• ( + [๋ฐฑ์ค€] 11050 ์ดํ•ญ๊ณ„์ˆ˜ ๋ฌธ์ œํ’€์ด)

์—ฐ_์šฐ๋ฆฌ 2022. 2. 13. 16:47
๋ฐ˜์‘ํ˜•

 

 

11050๋ฒˆ: ์ดํ•ญ ๊ณ„์ˆ˜ 1

์ฒซ์งธ ์ค„์— \(N\)๊ณผ \(K\)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ \(N\) ≤ 10, 0 ≤ \(K\) ≤ \(N\))

www.acmicpc.net

 + ์ดํ•ญ๊ณ„์ˆ˜?

๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํŒฉํ† ๋ฆฌ์–ผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

ํŒฉํ† ๋ฆฌ์–ผ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ํ’€์–ด๋ณด๊ธฐ

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


public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        int result = fact(n) / (fact(k) * fact(n-k));
        System.out.println(result);

    }

    private static int fact(int num) {
        if(num == 1 || num == 0){
            return 1;
        }
        return fact(num-1) * num;
    }
}

 

์žฌ๊ท€ํ•จ์ˆ˜๋Š” fact(5) ํ˜ธ์ถœ ํ›„ fact(5)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์„œ ๊ฐ’์„ ๊ตฌํ•œ๋‹ค.

fact(5)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค

 

์—ฌ๊ธฐ์„œ ๋‹ค์‹œ fact(5)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด? ๋˜‘๊ฐ™์ด ์‚ฌ์ง„์˜ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•  ๊ฒƒ์ด๋‹ค.

์ด๊ฒƒ์„ ์ €์žฅํ•ด์„œ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜์ž๋Š”๊ฒŒ DP์ด๋‹ค.

 

 

 

๋™์ ๊ณ„ํš๋ฒ• Dynamic Programming

๋™์ ๊ณ„ํš๋ฒ•์€ ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘๊ฒŒ ์ชผ๊ฐœ์–ด ์—ฐ์‚ฐํ•˜๊ณ , ์—ฐ์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

DP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„์˜ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ํ’€์–ด๋ณด์ž

 

 

 

ํŒฉํ† ๋ฆฌ์–ผ ์žฌ๊ท€ํ•จ์ˆ˜์™€ DP ์‚ฌ์šฉํ•˜์—ฌ ํ’€์–ด๋ณด๊ธฐ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;


public class Main11050 {
    static int[] dp;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
        dp = new int[n+1];

        int result = fact(n) / (fact(k) * fact(n-k));
        //System.out.println(Arrays.toString(dp));
        System.out.println(result);

    }

    private static int fact(int num) {
        if(dp[num] > 0){
            //System.out.println(num+"! found");
            return dp[num];
        }

        if(num == 1 || num == 0){
            dp[num] = 1;
            return dp[num];
        }

        dp[num] = fact(num-1) * num;
        //System.out.println(num + "! save");
        return dp[num];
    }
}

print๋ฌธ ์ฃผ์„์„ ํ’€๊ณ , fact(5)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ถœ๋ ฅ๋œ๋‹ค

2! save
3! save
4! save
5! save
2! found โญ ์ด๋ฏธ ์—ฐ์‚ฐํ•œ fact(2)๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค
3! found โญ ์ด๋ฏธ ์—ฐ์‚ฐํ•œ fact(3)๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค

 

 

DP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์‹œ ์—ฐ์‚ฐํ•˜์ง€ ์•Š์•„๋„ ๋˜๋‹ˆ ์‹คํ–‰ ์†๋„๋„ ๋นจ๋ผ์ง€๊ฒŒ๋œ๋‹ค.

DP๋Š” ์žฌ๊ท€ํ•จ์ˆ˜์—์„œ ๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์žฌ๊ท€ํ•จ์ˆ˜์—๋งŒ ํ•œ์ •๋œ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋ž€ ๊ฒƒ์„ ์•Œ๊ณ ์žˆ์ž!

๋ฐ˜์‘ํ˜•
  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
  • ๊ตฌ๊ธ€ ํ”Œ๋Ÿฌ์Šค ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ