์•Œ๊ณ ๋ฆฌ์ฆ˜๐Ÿˆ

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(๋™์  ๊ณ„ํš๋ฒ•)

Jeein0313 2023. 3. 22. 15:27

๐Ÿ’ก๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€?

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰์‹œ๊ฐ„ ํšจ์œจ์„ฑ์„ ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ์ด๋ฏธ ๊ณ„์‚ฐ๋  ๊ฒฐ๊ณผ(์ž‘์€ ๋ฌธ์ œ)๋Š” ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ €์žฅํ•˜์—ฌ(๋ฉ”๋ชจ์ด์ œ์ด์…˜) ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค. Divde and Conquer(๋ถ„ํ• ์ •๋ณต)๊ณผ ๋‹ค๋ฅธ ์ ์€, ๋ถ„ํ•  ์ •๋ณต์˜ ๊ฒฝ์šฐ ์ค‘๋ณต๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋‚˜, DP์˜ ๊ฒฝ์šฐ ์ค‘๋ณต๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

 

 

 

๐Ÿ’ก๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์กฐ๊ฑด

  • ์ตœ์  ๊ตฌ๋ถ„ ๊ตฌ์กฐ : ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž‘์€ ๋ฌธ์ œ์˜ ๋‹ต์„ ๋ชจ์•„ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ค‘๋ณต๋˜๋Š” ๋ฌธ์ œ : ๋™์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.

 

 

๐Ÿ’กํƒ‘๋‹ค์šด, ๋ฐ”ํ…€์—…

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ตฌํ˜„์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹(ํƒ‘๋‹ค์šด, ๋ณดํ…€์—…)์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

ํƒ‘๋‹ค์šด์˜ ๊ฒฝ์šฐ, ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด๋•Œ ๊ฐ€์žฅ ๋จผ์ € ํ˜ธ์ถœ๋˜๋Š” ๋ฌธ์ œ๋Š” ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋ช…์นญ์ด ๋ถ™์—ˆ๋‹ค. ํƒ‘๋‹ค์šด ๋ฐฉ์‹์€ ๊ฐ€๋…์„ฑ์ด ์ข‹๊ณ , ๋ณธ๋ž˜ ์ ํ™”์‹์„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

๋ฐ”ํ…€์—…์˜ ๊ฒฝ์šฐ, ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ฐ€์žฅ ์ž‘์€ ๋ฌธ์ œ๋“ค๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋‹ต์„ ์Œ“์•„ ์˜ฌ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ๋ถˆ๋ฆฐ๋‹ค. ๋ฐ”ํ…€์—…์˜ ์žฅ์ ์€ ํ•จ์ˆ˜๋ฅผ ๋ณ„๊ฐœ๋กœ ๋ถ€๋ฅด์ง€ ์•Š์•„ ์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋Ÿ‰ ๋” ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

 

 

 

 

๐Ÿ’ก์˜ˆ์ œ ์ฝ”๋“œ

์ „์— ํฌ์ŠคํŒ…ํ–ˆ๋˜ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ด์šฉํ•œ ํ’€์ด๋„ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค.

 

๋ฌธ์ œ1) ์ฒ ์ˆ˜๋Š” ํŽธ์˜์ ์—์„œ ์ผ์„ํ•˜๋Š”๋ฐ, ํ•˜๋Š” ์ผ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฌผ๊ฑด ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ณ  ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ๊ฑฐ์Šฌ๋Ÿฌ์ฃผ๋Š” ์ผ์ด๋‹ค. ๋งŒ์•ฝ ๊ฑฐ์Šค๋ฆ„๋ˆ 5์›์„ ๊ฑฐ์Šฌ๋Ÿฌ์ค˜์•ผ ํ•˜๋Š”๋ฐ ๋™์ „์ด 1์›, 2์›, 5์›์งœ๋ฆฌ๊ฐ€ ๋ฌดํ•œํžˆ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด ์ฒ ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์˜ ์ˆ˜(4๊ฐ€์ง€)๋กœ ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ๊ฑฐ์Šฌ๋Ÿฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.

  • 5์› 1๊ฐœ
  • 2์› 2๊ฐœ + 1์› 1๊ฐœ
  • 2์› 1๊ฐœ + 1์› 3๊ฐœ
  • 1์› 5๊ฐœ

์ด๋ ‡๊ฒŒ ๋™์ „์˜ ์ข…๋ฅ˜์™€ ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ๊ฑฐ์Šฌ๋Ÿฌ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ผ.

  • ๋™์ „์˜ ์ข…๋ฅ˜ : int[] type
  • ๊ฑฐ์Šค๋ฆ„๋ˆ : int target

ํ’€์ด)

์šฐ์„  ์œ„์˜ ์˜ˆ์ œ๋ฅผ ์ข€ ๋” ๊ฐ„๋‹จํžˆ  ์ชผ๊ฐœ์–ด ๋ณด์ž.

int[] type= {1,2,5} / 0์›์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ : 1๋กœ ์„ค์ •

 

1์›๋งŒ์œผ๋กœ)

1์›์„ ๋งŒ๋“ค ๋•Œ(target=1) : 1

2์›์„ ๋งŒ๋“ค ๋•Œ : 1+1 

3์›์„ ๋งŒ๋“ค ๋•Œ : 1+1+1

4์›์„ ๋งŒ๋“ค ๋•Œ : 1+1+1+1

5์›์„ ๋งŒ๋“ค ๋•Œ : 1+1+1+1+1

 

1์›๊ณผ 2์›๋งŒ์œผ๋กœ)

1์›์„ ๋งŒ๋“ค ๋•Œ : 1

2์›์„ ๋งŒ๋“ค ๋•Œ : 1+1 , 2 (๊ธฐ์กด์˜ 1์›์œผ๋กœ 2์›์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ + 0์›(2-2)์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜)

3์›์„ ๋งŒ๋“ค ๋•Œ : 1+1+1 , 1+2 (๊ธฐ์กด์˜ 1์›์œผ๋กœ 3์›์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ + 1์›(3-2)์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜)

4์›์„ ๋งŒ๋“ค ๋•Œ : 1+1+1+1 , 1+1+2,  2+2 (๊ธฐ์กด์˜ 1์›์œผ๋กœ 4์›์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ + 2์›(4-2)์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜)

5์›์„ ๋งŒ๋“ค ๋•Œ : 1+1+1+1+1 , 1+1+1+2, 1+2+2 (๊ธฐ์กด์˜ 1์›์œผ๋กœ 5์›์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ + 3์›(5-2)์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜)

 

1์›๊ณผ 2์›๊ณผ 5์›์œผ๋กœ)

1์›์„ ๋งŒ๋“ค ๋•Œ : 1

2์›์„ ๋งŒ๋“ค ๋•Œ : 1+1 , 2 (๊ทธ๋Œ€๋กœ)

3์›์„ ๋งŒ๋“ค ๋•Œ : 1+1+1 , 1+2 (๊ทธ๋Œ€๋กœ)

4์›์„ ๋งŒ๋“ค ๋•Œ : 1+1+1+1 , 1+1+2,  2+2 (๊ทธ๋Œ€๋กœ)

5์›์„ ๋งŒ๋“ค ๋•Œ : 1+1+1+1+1 , 1+1+1+2, 1+2+2 , 5 (๊ธฐ์กด์˜ 1์›์œผ๋กœ 5์›์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ + 0์›(5-5)์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜)

 

์ฝ”๋“œ)

public long ocean(int target, int[] type){
    long[] dp = new long[target + 1];
    dp[0] = 1;

    for(int i=0;i<type.length;i++){
        for(int j=1;j<=target;j++){
            if(type[i]<=j)
                dp[j] += dp[j - type[i]];
        }
    }
    return dp[target];
}

 

 

 

 

 

๋ฌธ์ œ2) ์ฒ ์ˆ˜๋Š” ํŽธ์˜์ ์—์„œ ์ผ์„ํ•˜๋Š”๋ฐ, ํ•˜๋Š” ์ผ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฌผ๊ฑด ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ณ  ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ๊ฑฐ์Šฌ๋Ÿฌ์ฃผ๋Š” ์ผ์ด๋‹ค. ๋งŒ์•ฝ ๊ฑฐ์Šค๋ฆ„๋ˆ 14์›์„ ๊ฑฐ์Šฌ๋Ÿฌ์ค˜์•ผ ํ•˜๋Š”๋ฐ ๋™์ „์ด 1์›, 4์›, 5์›,6์›์งœ๋ฆฌ๊ฐ€ ๋ฌดํ•œํžˆ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด ์ฒ ์ˆ˜๊ฐ€ ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ค‘์—์„œ ๋™์ „์„ ๊ฐฏ์ˆ˜๋ฅผ ์ตœ์†Œ๋กœ ํ•  ๋•Œ์˜ ๊ฐฏ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€?

 

ํ’€์ด)

๊ฐ€์žฅ ํ™”ํ ๋‹จ์œ„๊ฐ€ ํฐ ๊ฒƒ๋ถ€ํ„ฐ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋™์ „์„ ์ตœ์†Œ๋กœ ์‚ฌ์šฉํ•จ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? NO

6์›*2 + 1์› *2 -> 4๊ฐœ

5์›*2 + 4์›*1 -> 3๊ฐœ ( ์‚ฌ์šฉํ•˜๋Š” ๋™์ „์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋” ์ž‘์Œ)

 

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋Š” ์œ„์—์„œ ํ–ˆ๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ 1์›๋งŒ ์‚ฌ์šฉํ• ๋•Œ, 1์›๊ณผ 4์›์„ ์‚ฌ์šฉํ•  ๋•Œ, 1์›, 4์›, 5์›์„ ์‚ฌ์šฉํ•  ๋•Œ, ๋ชจ๋‘ ์‚ฌ์šฉํ• ๋•Œ๋กœ ๋‚˜๋ˆ ์„œ ํ’€์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์ •๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  1์›๋งŒ ์‚ฌ์šฉํ• ๋•Œ์—์„œ 1์›,4์›๋งŒ ์‚ฌ์šฉํ• ๋•Œ๋กœ ๋„˜์–ด๊ฐˆ ๋•Œ ๊ฐฏ์ˆ˜๋ฅผ ๋น„๊ตํ•ด ๋” ์ ์€ ๊ฒƒ์„ ์ €์žฅํ•˜๋„๋ก ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

1์›,4์› -> 1์›, 4์›, 5์›์œผ๋กœ ๋„˜์–ด๊ฐˆ ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€.

 

์œ„์˜ ๋ฌธ์ œ๋Š” ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ๋™์ „์„ ์ตœ์†Œ๋กœ ์‚ฌ์šฉํ• ๋•Œ๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๋งค๋ฒˆ ์–ด๋А ๊ฒƒ์ด ์ตœ์†Œ์ธ์ง€ ์ฒดํฌํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

์ฝ”๋“œ)

public void coin(int[] coins, int target){
    int[] dp = new int[target + 1];
    for(int i=1;i<=target;i++) dp[i]=1000001;

    for(int i=0;i<coins.length;i++){
        System.out.printf("๋™์ „ %d ์‚ฌ์šฉ์‹œ\n", coins[i]);
        for(int j=coins[i];j<=target;j++){
            dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);
            System.out.printf("%d %d\n",j,dp[j]);
        }
        System.out.println("-".repeat(60));
    }
    System.out.println(dp[target]);
}