๐Ÿ“ Coding Test Study/Algorithm Problem

[C++][BEAKJOON][DP] ๋™์ „1

ibelieveinme 2021. 9. 21. 14:39
728x90

[๋ฌธ์ œ]

 

2293๋ฒˆ: ๋™์ „ 1

์ฒซ์งธ ์ค„์— n, k๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) ๋‹ค์Œ n๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ๊ฐ์˜ ๋™์ „์˜ ๊ฐ€์น˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋™์ „์˜ ๊ฐ€์น˜๋Š” 100,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

www.acmicpc.net

 

[๋ฌธ์ œ์„ค๋ช…]
n๊ฐ€์ง€์˜ ๋™์ „์ด ์žˆ์„ ๋•Œ, ์ด ๋™์ „๋“ค์„ ์ ๋‹นํžˆ ํ•ฉ์ณ์„œ k์›์ด ๋˜๊ฒŒ ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ.

 


[ํ’€์ด]
Bottom-up ๋ฐฉ์‹์œผ๋กœ 1์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•, 2๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•, 3์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•, ... 10์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๊นŒ์ง€ ๊ตฌํ•  ๊ฒƒ์ด๋‹ค.
์ด ๋•Œ, 2,3,...์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ด์ „์— ๊ตฌํ•œ ๊ฐ’์„ ์ด์šฉํ•  ๊ฒƒ์ด๋‹ค.

๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ 1,2,5 ๋™์ „์œผ๋กœ ์ƒ๊ฐํ•ด๋ณด๋ฉด,
1,2,5๋กœ 1์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 1 ํ•œ๊ฐ€์ง€์ด๋‹ค.
1,2,5๋กœ 2๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 1+1, 2๋กœ ๋‘๊ฐ€์ง€์ด๋‹ค.
1,2,5๋กœ 3์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 1+1+1, 1+2๋กœ ๋‘๊ฐ€์ง€์ด๋‹ค.
1,2,5๋กœ 4๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 1+1+1+1, 1+1+2, 2+2๋กœ ์„ธ๊ฐ€์ง€์ด๋‹ค.
1,2,5๋กœ 5๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 1+1+1+1+1, 1+1+1+2, 1+2+2, 5๋กœ ๋„ค๊ฐ€์ง€์ด๋‹ค.
...

์œ„ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ž์„ธํžˆ ๋ณด๋ฉด, 1๋กœ ๋งŒ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 1~5๊นŒ์ง€์˜ ์ˆ˜๊ฐ€ ๋ชจ๋‘ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  1~5 ์ค‘์— 2๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— 2๋ฅผ ํฌํ•จ์‹œ์ผœ์„œ ๋งŒ๋“ค์—ˆ๊ณ ,
1~5 ์ค‘์— 5๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— 5๋ฅผ ํฌํ•จ์‹œ์ผœ์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰ 1์›์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋จผ์ € ๋”ํ•˜๊ณ 
DP[1] = 1 (1)
DP[2] = 1 (11)
DP[3] = 1 (111)
DP[4] = 1 (1111)
DP[5] = 1 (11111)

2์›์„ ์ถ”๊ฐ€ํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ตฌํ•ด์„œ ๋”ํ•˜๊ณ 
DP[1] = 1 (1)
DP[2] = 1+1 (11,2)
DP[3] = 1+DP[1] = 2 (111,12)
DP[4] = 1+DP[2] = 3 (1111,112,22)
DP[5] = 1+DP[3] = 3 (11111,1112,122)

5์›์„ ์ถ”๊ฐ€ํ•ด์„œ ๋งŒ๋“ค์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•ด์„œ ๋”ํ•˜๋ฉด ๋œ๋‹ค.
DP[1] = 1 (1)
DP[2] = 2 (11,2)
DP[3] = 2 (111,12)
DP[4] = 3 (1111,112,22)
DP[5] = 3+1 = 4 (11111,1112,122,5)

์ด ๋‚ด์šฉ์„ ์ ํ™”์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

dp[x] = y; // y๋Š” ์ฃผ์–ด์ง„ ๋™์ „๋“ค๋กœ x๋ฅผ ๋งŒ๋“ค ๋•Œ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋œปํ•จ.
dp[1] = 1 (1)
dp[2] = 2 (1+1, 2)
dp[3] = 2 (1+1+1, 1+2)
dp[4] = 3 (1+1+1+1, 1+1+2, 2+2)
dp[5] = 4 (1+1+1+1+1, 1+1+1+2, 1+2+2, 5)
...

dp[0] = 1;
for (int coin_idx = 0; coin_idx < coin_num; coin_idx++) { //1,2,5
   for (int i = 1; i <= value; i++) { //1~10
     if (i - coins[coin_idx] >= 0) {//1-1 >=0, 2-1>=0, 2-2>=0, 3-1>=0, 3-2>=0, 4-1>=0, 4-2>=0
       dp[i] += dp[i - coins[coin_idx]];
     }
}


์ฐธ๊ณ ๋กœ ์˜ˆ์ „์— '1๋กœ ๋งŒ๋“ค๊ธฐ'๋ผ๋Š” ๋ฌธ์ œ์—์„œ 2 -> 1๋กœ 3 -> 1๋กœ 4 -> 1๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ๊ตฌํ•œ ์ ์ด ์žˆ๋‹ค.
์ด ๋•Œ๋„ ์•ž์—์„œ ๊ตฌํ•œ ๊ฐ’์„ ์ด์šฉํ•ด์„œ bottom-up ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ–ˆ์—ˆ๋‹ค.
๊ทธ ๋ฐฉ๋ฒ•์€ ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๊ฐ’์„ 1๋กœ ๋งŒ๋“ค ๋•Œ, 2๋กœ ๋‚˜๋ˆ„๊ธฐ, 3์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ, 1๋นผ๊ธฐ ์˜ 3๊ฐ€์ง€ ๋ฐฉ์‹ ์ค‘์— ๊ฐ€๋Šฅํ•œ ํ•˜๋‚˜๋ฅผ ํƒํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ–ˆ๋‹ค.

for (int i = 2; i <= num; i++) {
   minCountArr[i] = minCountArr[i - 1] + 1;
   if (i % 2 == 0) minCountArr[i] = min(minCountArr[i / 2] + 1, minCountArr[i]);
   if (i % 3 == 0) minCountArr[i] = min(minCountArr[i / 3] + 1, minCountArr[i]);
}

๋™์ „๋ฌธ์ œ๋Š” 1๋กœ ๋งŒ๋“ค๊ธฐ์™€ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

[์ฝ”๋“œ]

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int coin_num, value; //1 ≤ coin_num ≤ 100, 1 ≤ value ≤ 10,000
	vector<int> coins;

	cin >> coin_num >> value;
	for (int i = 0; i < coin_num; i++) {
		int coin;
		cin >> coin;
		coins.push_back(coin);
	}

	int *dp = new int[value + 1]();
	dp[0] = 1;
	for (int coin_idx = 0; coin_idx < coin_num; coin_idx++) { //1,2,5
		for (int i = 1; i <= value; i++) { //1~10
			if (i - coins[coin_idx] >= 0) {
				dp[i] += dp[i - coins[coin_idx]];
			}
		}
	}
	cout << dp[value] << "\n";

	delete[] dp;
	return 0;
}
728x90