Home [BaekJoon] 1010 ๋‹ค๋ฆฌ๋†“๊ธฐ JAVA
Post
Cancel

[BaekJoon] 1010 ๋‹ค๋ฆฌ๋†“๊ธฐ JAVA

๐Ÿ”— ๋ฐฑ์ค€ 1010 ๋ฌธ์ œ https://www.acmicpc.net/problem/1010

๋ฌธ์ œ

์žฌ์›์ด๋Š” ํ•œ ๋„์‹œ์˜ ์‹œ์žฅ์ด ๋˜์—ˆ๋‹ค. ์ด ๋„์‹œ์—๋Š” ๋„์‹œ๋ฅผ ๋™์ชฝ๊ณผ ์„œ์ชฝ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ํฐ ์ผ์ง์„  ๋ชจ์–‘์˜ ๊ฐ•์ด ํ๋ฅด๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์žฌ์›์ด๋Š” ๋‹ค๋ฆฌ๊ฐ€ ์—†์–ด์„œ ์‹œ๋ฏผ๋“ค์ด ๊ฐ•์„ ๊ฑด๋„ˆ๋Š”๋ฐ ํฐ ๋ถˆํŽธ์„ ๊ฒช๊ณ  ์žˆ์Œ์„ ์•Œ๊ณ  ๋‹ค๋ฆฌ๋ฅผ ์ง“๊ธฐ๋กœ ๊ฒฐ์‹ฌํ•˜์˜€๋‹ค. ๊ฐ• ์ฃผ๋ณ€์—์„œ ๋‹ค๋ฆฌ๋ฅผ ์ง“๊ธฐ์— ์ ํ•ฉํ•œ ๊ณณ์„ ์‚ฌ์ดํŠธ๋ผ๊ณ  ํ•œ๋‹ค. ์žฌ์›์ด๋Š” ๊ฐ• ์ฃผ๋ณ€์„ ๋ฉด๋ฐ€ํžˆ ์กฐ์‚ฌํ•ด ๋ณธ ๊ฒฐ๊ณผ ๊ฐ•์˜ ์„œ์ชฝ์—๋Š” N๊ฐœ์˜ ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๊ณ  ๋™์ชฝ์—๋Š” M๊ฐœ์˜ ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค. (N โ‰ค M)

์žฌ์›์ด๋Š” ์„œ์ชฝ์˜ ์‚ฌ์ดํŠธ์™€ ๋™์ชฝ์˜ ์‚ฌ์ดํŠธ๋ฅผ ๋‹ค๋ฆฌ๋กœ ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ•œ๋‹ค. (์ด๋•Œ ํ•œ ์‚ฌ์ดํŠธ์—๋Š” ์ตœ๋Œ€ ํ•œ ๊ฐœ์˜ ๋‹ค๋ฆฌ๋งŒ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค.) ์žฌ์›์ด๋Š” ๋‹ค๋ฆฌ๋ฅผ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ์ง€์œผ๋ ค๊ณ  ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ์ชฝ์˜ ์‚ฌ์ดํŠธ ๊ฐœ์ˆ˜๋งŒํผ (N๊ฐœ) ๋‹ค๋ฆฌ๋ฅผ ์ง€์œผ๋ ค๊ณ  ํ•œ๋‹ค. ๋‹ค๋ฆฌ๋ผ๋ฆฌ๋Š” ์„œ๋กœ ๊ฒน์ณ์งˆ ์ˆ˜ ์—†๋‹ค๊ณ  ํ•  ๋•Œ ๋‹ค๋ฆฌ๋ฅผ ์ง€์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ.

img


์ž…๋ ฅ

์ž…๋ ฅ๊ณผ ์ฒซ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ๊ฐ•์˜ ์„œ์ชฝ๊ณผ ๋™์ชฝ์— ์žˆ๋Š” ์‚ฌ์ดํŠธ์˜ ๊ฐœ์ˆ˜ ์ •์ˆ˜ N, M (0 < N <= M < 30) ์ด ์ฃผ์–ด์ง„๋‹ค.


์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ์ฃผ์–ด์ง„ ์กฐ๊ฑด ํ•˜์— ๋‹ค๋ฆฌ๋ฅผ ์ง€์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


ํ’€์ด

์ผ๋‹จ ์ด ๋ฌธ์ œ๋ฅผ ๋”ฑ ๋ดค์„๋•Œ ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜์™€ ์ค‘๋ณต์ด ํ—ˆ๋ฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ถ€๋ถ„์—์„œ ์กฐํ•ฉ์„ ๋– ์˜ฌ๋ ธ๋‹ค.

์กฐํ•ฉ

n ๊ฐœ์˜ ์›์†Œ ์ค‘ ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜. ์ฆ‰, ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ ์ˆœ์—ด์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

nCr = nโˆ’โ‚Crโˆ’โ‚ + nโˆ’โ‚Cr

์กฐํ•ฉ์€ ์œ„์™€ ๊ฐ™์€ ๊ณต์‹์„ ๊ฐ–๊ณ  ์žˆ๋Š”๋ฐ ์ด๋Š”,

ํ•˜๋‚˜์˜ ์›์†Œ๋ฅผ ์„ ํƒํ•  ๊ฒฝ์šฐ + ํ•˜๋‚˜์˜ ์›์†Œ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด [1, 2, 3, 4, 5] ๊ฐ€ ์žˆ์„ ๋•Œ 3๊ฐœ๋ฅผ ๋ฝ‘๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ตฌํ•œ๋‹ค๊ณ  ํ•˜๋ฉด

  • 5๋ฅผ ๋ฏธ๋ฆฌ ์„ ํƒํ•  ๊ฒฝ์šฐ : ๋‚จ์€ ์ˆ˜ [1, 2, 3, 4]. ์„ ํƒ๋œ ์ˆ˜ [5]
    • ๋‚จ์€ ์ˆ˜ ์ค‘ 2๊ฐœ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ = [1, 2, 5], [1, 3, 5], [1, 4, 5], [2, 3, 5], [2, 4, 5], [3, 4, 5]. ์ด 6๊ฐœ
  • 5๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ : ๋‚จ์€ ์ˆ˜ [1, 2, 3, 4]
    • ๋‚จ์€ ์ˆ˜ ์ค‘ 3๊ฐœ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ = [1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]. ์ด 4๊ฐœ

์ฆ‰, 5Cr = 4C2 + 4C3 = 10๊ฐœ๊ฐ€ ๋œ๋‹ค.

๋ฝ‘์•„์•ผ ํ•  ๊ฐœ์ˆ˜์ธ r์ด 0์ด ๋˜๋ฉด ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์œผ๋ฏ€๋กœ 1์„ ๋ฆฌํ„ด์‹œํ‚จ๋‹ค.

์ „์ฒด ๊ฐœ์ˆ˜์™€ ๋ฝ‘์•„์•ผ ํ•  ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์ด ๋˜ํ•œ ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์œผ๋ฏ€๋กœ 1์„ ๋ฆฌํ„ด์‹œํ‚จ๋‹ค.


๊ทธ๋ฆฌ๊ณ  0.5 ์ดˆ๋ผ๋Š” ์‹œ๊ฐ„ ์ œํ•œ์ด ์žˆ๊ธฐ์— Dynamic Programming ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฒ•์˜ Top-down ์„ ํ™œ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ ์‹œ๊ฐ„ ํšจ์œจ์„ฑ์„ ํ–ฅ์ƒ์‹œ์ผœ์ฃผ์—ˆ๋‹ค.

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

DP ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฒ•์€ ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ €์žฅํ•˜์—ฌ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•˜์—ฌ ์ˆ˜ํ–‰ ์‹œ๊ฐ„ ํšจ์œจ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

Top-down ํ•˜ํ–ฅ์‹

์ƒ์œ„ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ์žฌ๊ท€๋กœ ํ˜ธ์ถœํ•˜์—ฌ ํ•˜์œ„ ๋ฌธ์ œ๋ถ€ํ„ฐ ์ƒ์œ„ ๋ฌธ์ œ๊นŒ์ง€ ์ˆœ์ฐจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹. ํ•ด๊ฒฐํ•ด๋†“์€ ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด Memoization์ด ์‚ฌ์šฉ๋œ๋‹ค.

Memoization

ํ•œ๋ฒˆ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๋ฉ”๋ชจํ•˜๋Š” ๊ธฐ๋ฒ•.

๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์‚ฌ์šฉ์„ ํ†ตํ•ด ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ๋‹จ ํ•œ๋ฒˆ์”ฉ๋งŒ ๊ณ„์‚ฐ๋œ๋‹ค๊ณ  ๋ณด์žฅ๋˜๊ธฐ์— ํ•จ์ˆ˜ ํ˜ธ์ถœ ํšŸ์ˆ˜๊ฐ€ ๊ฐ์†Œ๋œ๋‹ค.

๋‚ด๊ฐ€ ํ‘ผ ์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.io.*;
import java.util.StringTokenizer;

public class Main {
    private static final int[][] dp = new int[30][30]; // ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์œ„ํ•œ ํ–‰๋ ฌ, ๊ตฌํ•œ ๊ฐ’์„ ๋ฐ”๋กœ ์ €์žฅํ•ด๋‘”๋‹ค

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int T = Integer.parseInt(br.readLine());

        for (int i = 0; i < T; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int N = Integer.parseInt(st.nextToken());
            int M = Integer.parseInt(st.nextToken());

            bw.write(recursive(M, N) + "\n");
        }
        bw.flush();
        bw.close();
    }

    // M ์—์„œ N์„ ๋ฝ‘๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜
    private static int recursive(int n, int r) {

        /**
         * ๋ฉ”๋ชจ์ด์ œ์ด์…˜ O(n)
         * ํ•œ๋ฒˆ ๊ตฌํ•œ ๊ฐ’์€ ์ €์žฅ๋œ ๊ฐ’ ๋ฆฌํ„ด
         */
        if (dp[n][r] > 0) {
            return dp[n][r];
        }
        else if (n == r || r == 0) {
            return dp[n][r] = 1;
        }
        else {
            /**
             * Combination ์กฐํ•ฉ
             * nCr = n-1Cr-1 + n-1Cr
             * (n-1Cr-1) : ํ•˜๋‚˜์˜ ์›์†Œ๋ฅผ ์„ ํƒํ•  ๊ฒฝ์šฐ
             * (n-1Cr) : ํ•˜๋‚˜์˜ ์›์†Œ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ
             */
            return dp[n][r] = recursive(n - 1, r - 1) + recursive(n - 1, r);
        }
    }
}

์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ https://woongsios.tistory.com/179 https://loosie.tistory.com/150

Contents

[Java] Scanner VS BufferedReader

[BaekJoon] 1542 ์„ธ์ค€์„ธ๋น„ JAVA