Algorithm/λ¬Έμ œν’€μ΄

[λ°±μ€€] 17212번 - λ‹¬λ‚˜λΌ 토끼λ₯Ό μœ„ν•œ κ΅¬λ§€λŒ€κΈˆ μ§€λΆˆ λ„μš°λ―Έ (C++)

moaoh 2023. 8. 16. 22:54

 

17212번: λ‹¬λ‚˜λΌ 토끼λ₯Ό μœ„ν•œ κ΅¬λ§€λŒ€κΈˆ μ§€λΆˆ λ„μš°λ―Έ

λ‹¬λ‚˜λΌ 토끼듀이 μ‚¬μš©ν•˜λŠ” ν™”νλŠ” 동전뿐이닀. λ™μ „μ˜ μ’…λ₯˜λŠ” 1원, 2원, 5원, 7원 μ΄λ ‡κ²Œ 4μ’…λ₯˜κ°€ μžˆλ‹€. 물건을 사고 λ™μ „μœΌλ‘œ 계산을 ν•˜λŠ”λ° λ™μ „μ˜ κ°œμˆ˜κ°€ μ΅œμ†Œκ°€ λ˜λ„λ‘ μ§€λΆˆν•˜μ§€ μ•ŠλŠ” 것은 

www.acmicpc.net

 

 

문제

λ‹¬λ‚˜λΌ 토끼듀이 μ‚¬μš©ν•˜λŠ” ν™”νλŠ” 동전뿐이닀. λ™μ „μ˜ μ’…λ₯˜λŠ” 1원, 2원, 5원, 7원 μ΄λ ‡κ²Œ 4μ’…λ₯˜κ°€ μžˆλ‹€. 물건을 사고 λ™μ „μœΌλ‘œ 계산을 ν•˜λŠ”λ° λ™μ „μ˜ κ°œμˆ˜κ°€ μ΅œμ†Œκ°€ λ˜λ„λ‘ μ§€λΆˆν•˜μ§€ μ•ŠλŠ” 것은 λΆˆλ²•이닀. 예λ₯Ό λ“€μ–΄, 17원을 μ§€λΆˆν•  λ•Œ 7μ›μ§œλ¦¬ 동전 1κ°œμ™€ 5μ›μ§œλ¦¬ 동전 2개둜 μ§€λΆˆν•΄μ•Ό 합법이고, 7μ›μ§œλ¦¬ 동전 2κ°œμ™€ 2μ›μ§œλ¦¬ 동전 1개, 1μ›μ§œλ¦¬ 동전 1개둜 μ§€λΆˆν•΄λ„ 17원이 λ˜μ§€λ§Œ, 총 λ™μ „μ˜ κ°œμˆ˜κ°€ 4κ°œκ°€ λ˜μ–΄ μ΅œμ†Œ κ°œμˆ˜κ°€ μ•„λ‹ˆλ―€λ‘œ λΆˆλ²•μ΄λ‹€.

μ§€λΆˆ κΈˆμ•‘μ„ μž…λ ₯λ°›μ•„ ν•©λ²•이 λ˜λŠ” λ™μ „ 개수λ₯Ό 좜λ ₯으둜 λ‚΄μ–΄μ£ΌλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•΄λ³΄μž.

 

 

 

μž…λ ₯

첫 번째 쀄에 λ‹¬λ‚˜λΌ 토끼가 μ§€λΆˆν•΄μ•Όν•˜λŠ” κΈˆμ•‘ N(0 ≤ N ≤ 100,000)이 μ£Όμ–΄μ§„λ‹€.

 

 

 

좜λ ₯

첫 번째 쀄에 λ‹¬λ‚˜λΌ 토끼가 ν•©λ²•μ μœΌλ‘œ λ‚Ό 수 μžˆλŠ” λ™μ „μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

힌트

μ§€λΆˆ κΈˆμ•‘ 합법 μ§€λΆˆ λΆˆλ²• μ§€λΆˆ(예)
12원 7원 x 1개 + 5원 x 1개 5원 x 2개 + 2원 x 1개
17원 7원 x 1개 + 5원 x 2개 7원 x 2개 + 2원 x 1개 + 1원 x 1개
21원 7원 x 3개 7원 x 2개 + 5원 x 1개 + 2원 x 1개
 
 

 

풀이과정

ν•΄λ‹Ήλ¬Έμ œλ„ dp둜 μ ‘κ·Όν•΄μ„œ ν’€ 수 μžˆμ—ˆλ‹€.

λ¬Έμ œμ—μ„œ μ œκ³΅ν•˜λŠ” 동전에 μ΅œλŒ€κ°’μ€ 7원이라 0 ~ 7μ›μ˜ 경우 λ‚˜μ˜€λŠ” λ™μ „μ˜ 수λ₯Ό λͺ¨λ‘ κ΅¬ν•˜κ³  7원 μ΄μƒμ˜ 값듀은
dp(coin - 7) dp(coin - 5) dp(coin - 2) dp(coin - 1) 쀑 κ°€μž₯ μž‘μ€ 값을 κ΅¬ν•˜κ³  κ·Έ 값에 + 1을 ν•΄μ£ΌλŠ” ν˜•μ‹μœΌλ‘œ λ¬Έμ œν’€μ΄λ₯Ό μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

 

 

code

#include <iostream>
#include <algorithm>

int		f[100001];

int		dp(int coin)
{
	if (coin == 0) return (0);
	if (coin == 1) return (1);
	if (coin == 2) return (1);
	if (coin == 3) return (2);
	if (coin == 4) return (2);
	if (coin == 5) return (1);
	if (coin == 6) return (2);
	if (coin == 7) return (1);
	if (f[coin]) return (f[coin]);
	int min = std::min(std::min(std::min(dp(coin - 7), dp(coin - 5)), dp(coin - 2)), dp(coin - 1)) + 1;
	return (f[coin] = min);
}

int		main(void)
{
	int n;
	
	std::cin >> n;
	std::cout << dp(n);

	return (0);
}

 

ν›„κΈ°

λ¨Έλ¦¬λ‘œλŠ” μ΄ν•΄κ°€λ˜μ§€λ§Œ μ–΄λ–»κ²Œ 점화식을 μ„Έμ›Œμ•Όν• μ§€ 은근 고민을 λ§Žμ΄ν–ˆλ˜ λ¬Έμ œμ˜€λ˜ κ±° κ°™λ‹€.

μˆ˜ν•™μ μΈ κ°œλ…μ„ 쑰금 더 곡뢀λ₯Ό λ§Žμ΄ν•΄μ•Όν•  κ±° κ°™λ‹€.