1. ํ์ ์๊ณ ๋ฆฌ์ฆ (Greedy Algorithms)
ํ์(Greedy)์ ๋ง ๊ทธ๋๋ก ์ง๋์น๊ฒ ์์ฌ์ด ๋ง๋ค๋ ๋ป์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ํ์์๊ณ ๋ฆฌ์ฆ์ ๋ฌด์์ผ๊น?
๋ฏธ๋๋ฅผ ์๊ฐํ์ง ์๊ณ ํ์ฌ์ ๋จ๊ณ์์ ๊ฐ์ฅ ์ต์ ์ ์ ํ์ ํ๋ ๊ฒ์ ํ์์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํ๋ค.
๋์ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๋จํ ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉ ์ ๋ง์ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ์ฌ์ฉ๋ผ ๋นํจ์จ์ ์ด๋ค.
(๋์ ํ๋ก๊ทธ๋๋ฐ : ๊ฒฝ์ฐ์ ์๋ฅผ ๋ชจ๋ ๊ฒํ ํด ์ ํ์์ ํตํด ๊ตฌ์ฑ)
๋์ ํ๋ก๊ทธ๋๋ฐ์ ๋์ฒดํ๋ ๊ฒ์ ์๋๊ณ ๋์ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๊ฐ์ด ์ํฉ์ ๋ง๊ฒ ์ฐ์ด๋ ๊ฒ์ด ํ์์๊ณ ๋ฆฌ์ฆ์ด๋ค.
2. ํ์์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฆฝ ์กฐ๊ฑด
- ํ์์ ์ ํ ์์ฑ(Greedy Choice Property) : ํ์์ ์ ํ์ด ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ๊ตฌํ ์ ์๋ค , ์์ ์ ํ์ด ๋ค์ ์ ํ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ(Optimal Substructure) : ๋ฌธ์ ์ ์ต์ข ํด๊ฒฐ๋ฐฉ๋ฒ์ด ๋ถ๋ถ ๋ฌธ์ ์๋ ์ต์ ์ ํด๊ฒฐ๋ฐฉ๋ฒ์ด๋ค.
์ ์กฐ๊ฑด์ด ์ฑ๋ฆฝ๋์ง ์์ผ๋ฉด ํ์์๊ณ ๋ฆฌ์ฆ์ ์ต์ ์ ํด๋ฅผ ๊ตฌํ ์ ์๋ค.
โก๏ธ ๊ทผ์์์ ์ผ๋ก ํ๋จํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด์ ์ผ๋ก ์ต์ ์ ํด๋ฅผ ๊ตฌํ๋ค๊ณ ๋ณด์ฅ๋์ง ์๋๋ค.
โก๏ธ ๋์ ๊ทผ์ฌ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํด ์ค์ฉ์ ์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
โก๏ธ ํญ์ ์ต์ ์ ํด๋ ์๋์ง๋ง ๊ณ์ฐ ์๋๊ฐ ๋น ๋ฅด๋ค.
3. ํ์์๊ณ ๋ฆฌ์ฆ์ด ์ต์ ์ด ๋ ์ ์๋ ๊ฒฝ์ฐ
1) ๋ง์๋ฉ๋ก์ฐ ์ด์ผ๊ธฐ
1๋ถ์ ๊ธฐ๋ค๋ฆฌ๋ฉด ๋ง์๋ฉ๋ก์ฐ 1๊ฐ๋ฅผ ๋ฐ์ ์ ์๋ค.
2๋ถ์ ๊ธฐ๋ค๋ฆฌ๋ฉด ๋ง์๋ฉ๋ก์ฐ 4๊ฐ๋ฅผ ๋ฐ์ ์ ์๋ค.
ํ์์๊ณ ๋ฆฌ์ฆ ์ ํ ์ : ํ์ฌ์์ ๊ฐ์ฅ ์ต์ ์ ์ ํ์ ํ๋ฏ๋ก 1๋ถ์ ๊ธฐ๋ค๋ ค ๋ง์๋ฉ๋ก์ฐ 1๊ฐ๋ง ๋ฐ๋๋ค.
์ ์ฒด์ ์ผ๋ก ๋ดค์ ๋ ์ต์ ์ ์ ํ์ ํ๋ค๋ฉด 1๋ถ์ ๋ ๊ธฐ๋ค๋ ค ๋ง์๋ฉ๋ก์ฐ๋ฅผ 4๊ฐ ๋ฐ๋ ๊ฒ์ด ๋ ์ด๋์ด๋ค.
2) ๋๋ ์ด์ผ๊ธฐ
๋๋ ๋๋์ด๋ค.
์์ง ๊ฐ๋ถ์๋ค ์ง์ ๋ค์ด๊ฐ ๋ฌผ๊ฑด์ ๋ด์ ํ์น๋ ค๊ณ ํ๋ค.
ํ์ง๋ง ๋ด ๊ฐ๋ฐฉ์ 35kg๊น์ง ๋ฐ์ ๋ด์ ์ ์๋ค.
๊ฐ๋ถ์๋ค ์ง์์ ๋ฌด์์ ํ์ณ์ผ ํ ๊น?
๊ฐ๋ถ์๋ค ์ง ๋ฌผ๊ฑด๋ค
๐ฅ ๋๋ผ 30kg $1,500
๐ ๊ธ๋ฐ์ง 15kg $2,000
๐บ ํฐ๋น 10kg $2,000
๐น ํผ์๋ ธ 30kg $3,000
ํ์์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฌผ๊ฑด์ ํ์น ๋
- ๊ฐ๋ฐฉ์ ๋ฃ์ ์ ์๋ ๊ฐ์ฅ ๋น์ผ ๋ฌผ๊ฑด์ ๋ฃ๋๋ค.
- ๊ทธ๋ค์์ผ๋ก ๋ฃ์ ์ ์๋ ๋ฌผ๊ฑด ์ค ๊ฐ์ฅ ๋น์ผ ๋ฌผ๊ฑด์ ๋ฃ๋๋ค.
๊ฐ์ฅ ๋น์ผ ๋ฌผ๊ฑด์ธ ํผ์๋ ธ๋ฅผ ๊ฐ๋ฐฉ์ ๋ฃ์ผ๋ฉด
5kg๋ฐ์ ๋จ์ง ์์ ๋ ๋ฌผ๊ฑด์ ๋ด์ ์ ์๋ค.
๋ฐ๋ผ์ ํ์น ์ ์๋ ๋ฌผ๊ฑด์ ๊ฐ์น๋ $3,000์ด๋ค.
ํ์ง๋ง ํผ์๋ ธ ๋์ ํฐ๋น์ ๊ธ๋ฐ์ง๋ฅผ ๋ฃ์๋ค๋ฉด?
์ด $4,000 ๊ฐ์น์ ๋ฌผ๊ฑด์ ํ์น ์ ์๋ค.
์์ ์ค๋ช ํ ๊ฑฐ์ฒ๋ผ ๊ทผ์์์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํ๋จํ๊ณ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์
ํญ์ ์ต์ ์ ํด๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
3. ํ์์๊ณ ๋ฆฌ์ฆ์ด ์ต์ ์ด ๋๋ ๊ฒฝ์ฐ
๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ 11047๋ฒ : ๋์ 0
์ค๊ท๊ฐ ๊ฐ์ง๊ณ ์๋ ๋์ ์ ์ด N์ข ๋ฅ์ด๊ณ , ๊ฐ๊ฐ์ ๋์ ์ ๋งค์ฐ ๋ง์ด ๊ฐ์ง๊ณ ์๋ค.
๋์ ์ ์ ์ ํ ์ฌ์ฉํด์ ๊ทธ ๊ฐ์น์ ํฉ์ K๋ก ๋ง๋ค๋ ค๊ณ ํ๋ค. ์ด๋ ํ์ํ ๋์ ๊ฐ์์ ์ต์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ฌธ์ ๋ ํ์์ ์ ํ์์ฑ๊ณผ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๊ฐ ์ฑ๋ฆฝ๋๋ฏ๋ก ํ์์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ์ต์ ํด๋ฅผ ๊ตฌํ ์ ์๋ค.โ
ํ์ฌ์ ์ ํ์ด ๋ค์ ์ ํ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ ์ฒด ๋ฌธ์ ํด๊ฒฐ๋ฐฉ๋ฒ์ด ๋ถ๋ถ ๋ฌธ์ ํด๊ฒฐ๋ฐฉ๋ฒ์ด ๋๋ค.
๋์ ์ ๊ฐ์๋ฅผ ์ค์ด๊ธฐ ์ํด์ ๊ฐ์ฅ ๊ฐ์น๊ฐ ๋์ ๋์ ์ ์ ํํ๊ณ ์ดํ์ ํ ๋จ๊ณ ์๋ ์๋ ๋์ ๋ค๋ก ๋จ์ ๊ฐ์ ์ฑ์๋๊ฐ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์์ฝ๋
const input = require('fs').readFileSync('dev/stdin').toString().trim().split('\n');
let arr1 = input.shift().split(' ');
// ์ค๊ท๊ฐ ๊ฐ์ง ๋์ ์ ์ด ๊ฐ์
let length = arr1[0];
// ๊ฐ์น์ ํฉ
let k = arr1[1];
// ๋์ ์ด ์ค๋ฆ์ฐจ์์ผ๋ก ๋ค์ด์๋ ๋ฐฐ์ด
let coins = input.map(Number)
// ๋์ ์ ๊ฐ์๋ฅผ ๋ด๊ธฐ์ํ ๋ณ์ count
let count = 0;
// ํ์์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ
// ๊ฐ์น๊ฐ ๊ฐ์ฅ ํฐ (๊ฐ์ด ์ ์ผ ํฐ) ๋์ ์ผ๋ก k๋ฅผ ์ฑ์ฐ๊ณ ๋จ์ ๊ฐ์
// ๊ทธ ์๋๋ก ๊ฐ์น๊ฐ ํฐ(๊ฐ์ด ํฐ) ๋์ ๋ค๋ก ์ฑ์๊ฐ๋ค
for (let i = length ; i >= 0 ; i --) {
// ๋์ ์ฌ์ฉ์ ์ ์ ์ฑ ๊ฒ์ฌ
if (coins[i] <= k) {
// ๋์ ์ ๊ฐ์๋ฅผ ๋ชซ์ผ๋ก ๊ณ์ฐํด ์์์ ์ ๋ฒ๋ฆฌ๊ณ count์ ๋ํจ
count += Math.floor(k / coins[i]);
// ๋๋จธ์ง ๊ฐ์ k์ ์ ์ฅ
k = k % coins[i];
}
}
console.log(count);
์ ๋ฆฌ
๐ ํ์์๊ณ ๋ฆฌ์ฆ์ ๋ฏธ๋๋ฅผ ์๊ฐํ์ง ์๊ณ ํ์ฌ ์ํฉ์์ ๊ฐ์ฅ ์ต์ ์ ๋ต์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๐ ํ์์๊ณ ๋ฆฌ์ฆ์ ๊ทผ์ฌ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ฐ์ผ ์ ์์ผ๋ฉฐ ํญ์ ์ต์ ์ ๋ต์ ์๋์ง๋ง ์๋๋ ๋น ๋ฅด๋ค.
Refernce(์ฐธ์กฐ)
https://www.zerocho.com/category/Algorithm/post/584ba5c9580277001862f188
https://hevton.tistory.com/364
https://hanamon.kr/์๊ณ ๋ฆฌ์ฆ-ํ์์๊ณ ๋ฆฌ์ฆ-greedy-algorithm/
https://velog.io/@shitaikoto/Algorithm-GreedyAlgorithm-DynamicProgramming
'Algorithms > Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ณธ] ์์ ํ์ (๋ธ๋ฃจํธ ํฌ์ค Brute Force) (0) | 2022.05.25 |
---|---|
[์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ณธ] ํ๋ ธ์ดํ ์๊ณ ๋ฆฌ์ฆ (0) | 2022.05.18 |