๊ทธ๋ฆฌ๋(Greedy)
- ํ์๋ฒ ์๊ณ ๋ฆฌ์ฆ
- ํ์ฌ ์ํฉ์์ ๊ฐ์ฅ ์ข์ ๊ฒ์ ๊ณ ๋ฅด๋ ์๊ณ ๋ฆฌ์ฆ
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
- ์ ํ ์ ์ฐจ(Selection Procedure): ํ์ฌ ์ํ์์ ์ต์ ์ ํด๋ต ์ ํ
- ์ ์ ์ฑ ๊ฒ์ฌ(Feasibility Check): ์ ํ๋ ํด๊ฐ ๋ฌธ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ๊ฒ์ฌ
- ํด๋ต ๊ฒ์ฌ(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)
'๐ Computer Science > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(Dynamic Programming) (0) | 2022.03.30 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ์ด์ง ํ์(Binary Search) (0) | 2022.03.25 |
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ(Sorting) (0) | 2022.03.24 |
[์๊ณ ๋ฆฌ์ฆ] DFS/ BFS (0) | 2022.03.23 |
[์๊ณ ๋ฆฌ์ฆ] ๊ตฌํ(Implementation) (0) | 2022.03.22 |