Greedy

Greedy

๊ทธ๋ฆฌ๋””(ํƒ์š•) ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Greedy)

: ๊ทธ ์ˆœ๊ฐ„์ˆœ๊ฐ„๋งˆ๋‹ค ์ตœ์ ์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜๋Š” ๊ฒฐ์ •์„ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜์—ฌ ์ตœ์ข… ํ•ด๋‹ต์— ๋„๋‹ฌํ•˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ์‹ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ, ๊ฒฝ์šฐ๋ฅผ ์„ ํƒํ•ด์•ผํ•  ๋•Œ ์ตœ์„ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์„ ํƒํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์˜ˆ

    : ์ง€๋ถˆํ•ด์•ผ ํ•˜๋Š” ๊ฐ’์ด ์žˆ์„๋•Œ, ๋™์ „์œผ๋กœ ๋™์ „ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ ๊ฒŒ ์ง€๋ถˆํ•˜๋Š” ๋ฐฉ์‹

์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ (MinimumSpanningTree, MST)

: ์‚ฌ์šฉ๋œ ๊ฐ„์„ ๋“ค์˜ ๊ฐ€์ค‘์น˜ ํ•ฉ์ด ์ตœ์†Œ์ธ ํŠธ๋ฆฌ

MST์˜ ํŠน์ง•

  • ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์ด ์ตœ์†Œ์—ฌ์•ผํ•œ๋‹ค

  • n๊ฐœ์˜ ์ •์ ์„ ๊ฐ€์ง€๋Š” ๊ทธ๋ž˜ํ”„์— ๋Œ€ํ•ด ๋ฐ˜๋“œ์‹œ (n-1)๊ฐœ์˜ ๊ฐ„์„ ๋งŒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค

  • ์‚ฌ์ดํด์ด ํฌํ•จ๋˜์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค

MST์˜ ์ข…๋ฅ˜ : Greedy, Prim's, Kruskal's

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์˜ˆ์ œ(Baek5585)

  • ํƒ€๋กœ๋Š” ์ž์ฃผ JOI์žกํ™”์ ์—์„œ ๋ฌผ๊ฑด์„ ์‚ฐ๋‹ค.

  • JOI์žกํ™”์ ์—๋Š” ์ž”๋ˆ์œผ๋กœ 500์—”, 100์—”, 50์—”, 10์—”, 5์—”, 1์—”์ด ์ถฉ๋ถ„ํžˆ ์žˆ๊ณ ,

  • ์–ธ์ œ๋‚˜ ๊ฑฐ์Šค๋ฆ„๋ˆ ๊ฐฏ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ ๊ฒŒ ์ž”๋ˆ์„ ์ค€๋‹ค. ํƒ€๋กœ๊ฐ€ JOI์žกํ™”์ ์—์„œ ๋ฌผ๊ฑด์„ ์‚ฌ๊ณ  ์นด์šดํ„ฐ์—์„œ 1000์—” ์ง€ํ๋ฅผ ํ•œ์žฅ ๋ƒˆ์„ ๋•Œ,

  • ๋ฐ›์„ ์ž”๋ˆ์— ํฌํ•จ๋œ ์ž”๋ˆ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค

// ์ž…๋ ฅ : 380 ์ถœ๋ ฅ : 4
public class Baek5585 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); 
        int money = 1000 - sc.nextInt();
        int[] array = { 500, 100, 50, 10, 5, 1 };
        int idx = 0;
        int ans = 0;
        while (money != 0) {
            int change = money / array[idx];
            money -= change * array[idx++];
            ans += change;
        }
        System.out.println(ans);
    }
}
a = 1000 - int(input())
b = [500, 100, 50, 10, 5, 1]
count = 0
for i in b:
    count += a // i
    a %= i
print(count)

Last updated

Was this helpful?