๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“š Computer Science/Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๊ทธ๋ฆฌ๋””(Greedy)

by hyebin (Helia) 2022. 3. 8.
๋ฐ˜์‘ํ˜•

๊ทธ๋ฆฌ๋””(Greedy)

  • ํƒ์š•๋ฒ• ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ํ˜„์žฌ ์ƒํ™ฉ์—์„œ ๊ฐ€์žฅ ์ข‹์€ ๊ฒƒ์„ ๊ณ ๋ฅด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

๊ทธ๋ฆฌ๋””  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. ์„ ํƒ ์ ˆ์ฐจ(Selection Procedure): ํ˜„์žฌ ์ƒํƒœ์—์„œ ์ตœ์ ์˜ ํ•ด๋‹ต ์„ ํƒ
  2. ์ ์ ˆ์„ฑ ๊ฒ€์‚ฌ(Feasibility Check): ์„ ํƒ๋œ ํ•ด๊ฐ€ ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌ
  3. ํ•ด๋‹ต ๊ฒ€์‚ฌ(Solution Check): ์›๋ž˜์˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ๊ฒ€์‚ฌ, ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์„ ํƒ ์ ˆ์ฐจ๋กœ ๋Œ์•„์™€ ์œ„์˜ ๊ณผ์ • ๋ฐ˜๋ณต

 

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์กฐ๊ฑด

  • ํƒ์š•์Šค๋Ÿฌ์šด ์„ ํƒ ์กฐ๊ฑด(Greedy Choice Property): ์•ž์˜ ์„ ํƒ์ด ์ดํ›„์˜ ์„ ํƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค
  • ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ(Optimal Substructure): ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ตœ์ข… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ถ€๋ถ„ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ตœ์  ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด๋‹ค.

 


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

๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ

๋‹น์‹ ์€ ์Œ์‹์  ๊ณ„์‚ฐ์„ ๋„์™€์ฃผ๋Š” ์ ์›์ด๋‹ค. ์นด์šดํ„ฐ์—๋Š” ๊ฑฐ์Šค๋ฆ„๋ˆ์œผ๋กœ ์‚ฌ์šฉํ•  500์›, 100์›, 50์›, 10์›์งœ๋ฆฌ ๋™์ „์ด ๋ฌดํ•œํžˆ ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ์†๋‹˜์—๊ฒŒ ๊ฑฐ์Šฌ๋Ÿฌ ์ค˜์•ผ ํ•  ๋ˆ์ด N ์›์ผ ๋•Œ ๊ฑฐ์Šฌ๋Ÿฌ ์ค˜์•ผ ํ•  ๋™์ „์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ.
๋‹จ, ๊ฑฐ์Šฌ๋Ÿฌ์ค˜์•ผ ํ•  ๋ˆ N์€ ํ•ญ์ƒ 10์˜ ๋ฐฐ์ˆ˜์ด๋‹ค.

"๊ฐ€์žฅ ํฐ ํ™”ํ ๋‹จ์œ„๋ถ€ํ„ฐ" ๋ˆ์„ ๊ฑฐ์Šฌ๋Ÿฌ ์ฃผ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

 

var n = Int(readLine()!)!
var coin: [Int] = [500, 100, 50, 10]
var count = 0

for c in coin{
    count += n/c
    n %= c
}
print(count)

 

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ํ›„ ํ•ด๋ฒ•์ด ์ •๋‹นํ•œ์ง€ ๊ฒ€ํ† ํ•ด์•ผ ํ•œ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ๋ฌธ์ œ์˜ ๋™์ „ ์ค‘์—์„œ ํฐ ๋‹จ์œ„๊ฐ€ ํ•ญ์ƒ ์ž‘์€ ๋‹จ์œ„์˜ ๋ฐฐ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์€ ๋‹จ์œ„์˜ ๋™์ „๋“ค์„ ์ข…ํ•ฉํ•ด ๋‹ค๋ฅธ ํ•ด๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 


ํฐ ์ˆ˜์˜ ๋ฒ•์น™

๋™๋นˆ์ด์˜ ํฐ ์ˆ˜์˜ ๋ฒ•์น™์€ ๋‹ค์–‘ํ•œ ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์ด ์žˆ์„ ๋•Œ ์ฃผ์–ด์ง„ ์ˆ˜๋“ค์„ M๋ฒˆ ๋”ํ•˜์—ฌ ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๋ฒ•์น™์ด๋‹ค.
๋‹จ, ๋ฐฐ์—ด์˜ ํŠน์ •ํ•œ ์ธ๋ฑ์Šค์— ํ•ด๋‹นํ•˜๋Š” ์ˆ˜๊ฐ€ ์—ฐ์†ํ•ด์„œ k๋ฒˆ ๋”ํ•ด์งˆ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด ์ด ๋ฒ•์น™์˜ ํŠน์ง•์ด๋‹ค.

๋ฐฐ์—ด์˜ ํฌ๊ธฐ N, ๋”ํ•ด์ง€๋Š” ํšŸ์ˆ˜ M, ๊ทธ๋ฆฌ๊ณ  K๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ ๋™๋นˆ์ด์˜ ํฐ ์ˆ˜์˜ ๋ฒ•์น™์— ๋”ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ k๋ฒˆ ๋”ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ๋กœ ํฐ ์ˆ˜๋ฅผ ํ•œ๋ฒˆ ๋”ํ•˜๋Š” ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณต

var input = readLine()!.split(separator: " ").map{Int(String($0))!}
var data = readLine()!.split(separator: " ").map{Int(String($0))!}
var n = input[0], m = input[1], k = input[2]
var re = 0
data.sort()

while m != 0 {
    for _ in 0..<k{
        if m == 0{ break}
        re += data[n-1]
        m -= 1
    }
    if m == 0{ break }
    re += data[n-2]
    m -= 1
}

print(re)

n: 5 m: 8 k:3 arr: [2,4,5,4,6] ์ด ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์˜ฌ ๋•Œ,

(6+6+6+5) + (6+6+6+5)๋กœ ์ •๋‹ต์€ 46์ด๋‹ค.

 

์œ„์˜ ์˜ˆ์‹œ์—์„œ {6,6,6,5} ์ˆ˜์—ด์ด ๋ฐ˜๋ณต๋œ๋‹ค. ๋ฐ˜๋ณต๋˜๋Š” ์ˆ˜์—ด์˜ ๊ธธ์ด๋Š” (k+1)๋กœ, ๋ฐ˜๋ณต๋˜๋Š” ํšŸ์ˆ˜๋Š” m/(k+1)์ด๋‹ค.

๋ฐ˜๋ณต๋˜๋Š” ํšŸ์ˆ˜ m/(k+1)์— k๋ฅผ ๊ณฑํ•˜๋ฉด ๊ฐ€์žฅ ํฐ ์ˆ˜์˜ ๋“ฑ์žฅ ํšŸ์ˆ˜๊ฐ€ ๋œ๋‹ค.

์ด๋•Œ, m์ด (k+1)๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด m%(k+1) ์—ฐ์‚ฐ์„ ํ•˜์—ฌ ๋‚˜๋จธ์ง€ ๊ฐ’์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ํฐ ์ˆ˜๊ฐ€ ๋”ํ•ด์ง€๋Š” ํšŸ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

m/(k+1) * k  + m%(k+1)

var input = readLine()!.split(separator: " ").map{Int(String($0))!}
var data = readLine()!.split(separator: " ").map{Int(String($0))!}
var n = input[0], m = input[1], k = input[2]

data.sort()

var cnt = (m/(k+1)*k) + (m%(k+1))
var re = cnt*data[n-1] + (m-cnt)*data[n-2]
print(re)

 


์ˆซ์ž ์นด๋“œ ๊ฒŒ์ž„

์ˆซ์ž ์นด๋“œ ๊ฒŒ์ž„์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ˆซ์ž ์นด๋“œ ์ค‘์—์„œ ๊ฐ€์žฅ ๋†’์€ ์ˆซ์ž๊ฐ€ ์“ฐ์ธ ์นด๋“œ ํ•œ ์žฅ์„ ๋ฝ‘๋Š” ๊ฒŒ์ž„์ด๋‹ค.
๋‹จ, ๊ฒŒ์ž„์˜ ๋ฃฐ์„ ์ง€ํ‚ค๋ฉฐ ์นด๋“œ๋ฅผ ๋ฝ‘์•„์•ผ ํ•˜๊ณ  ๋ฃฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. ์ˆซ์ž๊ฐ€ ์“ฐ์ธ ์นด๋“œ๋“ค์ด N x M ํ˜•ํƒœ๋กœ ๋†“์—ฌ์žˆ๋‹ค. ์ด๋•Œ N์€ ํ–‰์˜ ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, M์€ ์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
2. ๋จผ์ € ๋ฝ‘๊ณ ์ž ํ•˜๋Š” ์นด๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ํ–‰์„ ์„ ํƒํ•œ๋‹ค.
3. ๊ทธ๋‹ค์Œ ์„ ํƒ๋œ ํ–‰์— ํฌํ•จ๋œ ์นด๋“œ๋“ค ์ค‘ ๊ฐ€์žฅ ๋‚ฎ์€ ์นด๋“œ๋ฅผ ๋ฝ‘์•„์•ผ ํ•œ๋‹ค.
4. ๋”ฐ๋ผ์„œ ์ฒ˜์Œ์— ์นด๋“œ๋ฅผ ๊ณจ๋ผ๋‚ผ ํ–‰์„ ์„ ํƒํ•  ๋•Œ ์ดํ›„์— ํ•ด๋‹น ํ–‰์—์„œ ๊ฐ€์žฅ ์ˆซ์ž๊ฐ€ ๋‚ฎ์€ ์นด๋“œ๋ฅผ ๋ฝ‘์„ ๊ฒƒ์„ ๊ณ ๋ คํ•˜์—ฌ ์ตœ์ข…์ ์œผ๋กœ ๊ฐ€์žฅ ๋†’์€ ์ˆซ์ž์˜ ์นด๋“œ๋ฅผ ๋ฝ‘์„ ์ˆ˜ ์žˆ๋„๋ก ์ „๋žต์„ ์„ธ์›Œ์•ผ ํ•œ๋‹ค.

๊ฐ ํ–‰๋งˆ๋‹ค ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜๋ฅผ ์ฐพ์€ ๋’ค์— ๊ทธ ์ˆ˜ ์ค‘์—์„œ ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ

var input = readLine()!.split(separator: " ").map{Int(String($0))!}
var n = input[0], m = input[1]

var re = 0

for _ in 0..<n{
    var data = readLine()!.split(separator: " ").map{Int(String($0))!}
    var min = data.min()!
    
    re = max(re, min)
}

print(re)

1์ด ๋  ๋•Œ๊นŒ์ง€

์–ด๋– ํ•œ ์ˆ˜ N์ด 1์ด ๋  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ์˜ ๋‘ ๊ณผ์ • ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์„ ํƒํ•˜์—ฌ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
๋‹จ, ๋‘ ๋ฒˆ์งธ ์—ฐ์‚ฐ์€ N์ด K๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์งˆ ๋•Œ๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

1. N์—์„œ 1์„ ๋บ€๋‹ค.
2. N์„ K๋กœ ๋‚˜๋ˆˆ๋‹ค.

N๊ณผ K๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, N์ด 1์ด ๋  ๋•Œ๊นŒ์ง€ 1๋ฒˆ ํ˜น์€ 2๋ฒˆ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ตœ์†Œ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ตœ๋Œ€ํ•œ ๋งŽ์ด ๋‚˜๋ˆ„๊ธฐ ์œ„ํ•ด N์ด K๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์งˆ ๋•Œ๊นŒ์ง€ N์„ 1์”ฉ ๊ฐ์†Œ์‹œํ‚ค๊ณ , N์ด K๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด N์„ K๋กœ ๋‚˜๋ˆ„๋Š” ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณต

var input = readLine()!.split(separator: " ").map{Int(String($0))!}
var n = input[0], k = input[1]
var re = 0

while n>=k{
    while n%k != 0{
        n -= 1
        re += 1
    }
    n /= k
    re += 1
}
while n > 1{
    n -= 1
    re += 1
}

print(re)

N์ด K์˜ ๋ฐฐ์ˆ˜๊ฐ€ ๋˜๋„๋ก ํšจ์œจ์ ์œผ๋กœ ํ•œ ๋ฒˆ์— ๋นผ๋Š” ๋ฐฉ์‹

var input = readLine()!.split(separator: " ").map{Int(String($0))!}
var n = input[0], k = input[1]
var re = 0

while true{
    var target = n/k * k
    re += n-target
    n = target
    
    if n<k{ break }
    re += 1
    n /= k
}

re += (n-1)
print(re)
๋ฐ˜์‘ํ˜•