# 1. ๋น์ฅ ์ข์ ๊ฒ๋ง ์ ํํ๋ ๊ทธ๋ฆฌ๋
๊ทธ๋ฆฌ๋(Greedy) ์๊ณ ๋ฆฌ์ฆ
: ํ์์ ์๊ณ ๋ฆฌ์ฆ์ ๋ป์, 'ํ์ฌ ์ํฉ์์ ์ง๊ธ ๋น์ฅ ์ข์ ๊ฒ๋ง ๊ณ ๋ฅด๋ ๋ฐฉ๋ฒ'์ ์๋ฏธํ๋ค.
๋ฐ๋ผ์, ๋งค์๊ฐ ๊ฐ์ฅ ์ข์๋ณด์ด๋ ๊ฒ์ ์ ํํ๊ฒ ๋๋ฉฐ, ํ์ฌ์ ์ ํ์ด ๋ฏธ๋์ ์ด๋ค ์ํฅ์ ๋ฏธ์น ์ง ๊ณ ๋ คํ์ง ์๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ '์ ๋น์ฑ ๋ถ์'์ด ์ค์ํ๋ค.
๋จ์ํ ํ์ฌ best๋ฅผ ์ ํํด๋ ๊ทธ๊ฒ ์ต์ ์ ํด๊ฐ ๋๋์ง ๊ฒํ ๊ฐ ํ์ํ๋ค๋ ์๋ฆฌ์ด๋ค!
์ฝ๋ฉ ํ ์คํธ์์ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ฌธ์ ์ ํ์
'์ฌ์ ์ ์ธ์ฐ๊ณ ์์ง ์์๋ ํ ์ ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ฌธ์ ์ ํ'์ด๋ค.
๋ฐ๋ฉด ์ดํ์ ๊ณต๋ถํ ์ ๋ ฌ, ์ต๋จ ๊ฒฝ๋ก ๋ฑ์ ์๊ณ ๋ฆฌ์ฆ ์ ํ์
์ด๋ฏธ ๊ทธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ๋ฐฉ๋ฒ์ ์ ํํ๊ฒ ์์์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๋ํ, ๊ทธ๋ฆฌ๋๋ ๊ธฐ์ค์ ๋ฐ๋ผ ์ข์ ๊ฒ์ ์ ํํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ฏ๋ก
๋ฌธ์ ์์ '๊ฐ์ฅ ํฐ ์์๋๋ก', '๊ฐ์ฅ ์์ ์์๋๋ก'์ ๊ฐ์ ๊ธฐ์ค์ ์๊ฒ ๋ชจ๋ฅด๊ฒ ์ ์ํด์ค๋ค.
๋์ฒด๋ก ์ด ๊ธฐ์ค์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ ๋ ๋ง์กฑ์ํฌ ์ ์์ผ๋ฏ๋ก
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ ์์ฃผ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ง์ ์ด๋ค ์ถ์ ๋๋ค.
์ค์ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ๋ค ๊ณ์ฐํด๋ณด๊ณ ๊ทธ ์ค ์ต์ ์ ํด๊ฐ ๋์ค๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์ผ๋ฉด best๊ฐ ๋๊ฒ ์ง๋ง (์ฒซ๋ฒ์งธ ์ฌ์ง = 21)
์ด ๊ฒฝ์ฐ ์๊ฐ์ด ๋งค์ฐ ๋ง์ด ์์๋๋ค.
๋ฐ๋ผ์, ํ์๋ฒ์ ํ์ฌ ์๊ฐ์ ๊ฐ์ฅ ์ต์ ์ ์ ํ์ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.(๋๋ฒ์งธ ์ฌ์ง = 19)
์ด์ ๊ฐ์ด ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ต์ ์ ํด๋ฅผ ๋ณด์ฅํ ์ ์์ ๋๊ฐ ๋ง๋ค.
ํ์ง๋ง, ์ฝ๋ฉํ ์คํธ์์ ๋๋ถ๋ถ์ ๊ทธ๋ฆฌ๋ ๋ฌธ์ ๋ ํ์๋ฒ์ผ๋ก ์ป์ ํด๊ฐ ์ต์ ์ ํด๊ฐ ๋๋ ์ํฉ์์, ์ด๋ฅผ ์ถ๋ก ํ ์ ์์ด์ผ ํ๋ฆฌ๋๋ก ์ถ์ ๋๋ค.
# ์์ 3-1. ๊ฑฐ์ค๋ฆ๋
๐ก '๊ฐ์ฅ ํฐ ํํ๋จ์'๋ถํฐ ๋์ ๊ฑฐ์ฌ๋ฌ ์ค๋ค
why? ํฐ ๋จ์๊ฐ ํญ์ ์์ ๋จ์์ ๋ฐฐ์์ด๋ฏ๋ก ์์ ๋จ์์ ๋์ ๋ค์ ์ข ํฉํด ๋ค๋ฅธ ํด๊ฐ ๋์ฌ ์ ์๊ธฐ ๋๋ฌธ
์๋ฅผ ๋ค์ด N = 1,260์ผ ๋๋ฅผ ๊ณ ๋ คํด๋ณด์.
- 500์์ ๊ฐ์๋ 1,260 // 500 = 2(๊ฐ)
- 100์์ ๊ฐ์๋ 1,260 % 500 = 260 // 100 = 2(๊ฐ)
- 50์์ ๊ฐ์๋ 260 % 100 = 60 // 50 = 1(๊ฐ)
- 10์์ ๊ฐ์๋ 60 % 50 = 10 // 10 = 1(๊ฐ)
์ฝ๋ ๋ถ์
n = 1260
count = 0
# ํฐ ๋จ์์ ํํ๋ถํฐ ์ฐจ๋ก๋๋ก ํ์ธ
coin_types = [500,100,50,10]
for coin in coin_types:
count += n // coin
n %= coin
print(count)
์๊ฐ ๋ณต์ก๋ ๋ถ์
ํํ์ ์ข ๋ฅ๊ฐ K๊ฐ๋ผ๋ฉด ์๊ฐ ๋ณต์ก๋๋ O(K)์ด๋ค.
์ด๋ ๋์ ์ ์ด ์ข ๋ฅ์๋ง ์ํฅ์ ๋ฐ๊ณ , ๊ฑฐ์ฌ๋ฌ์ค์ผ ํ๋ ๊ธ์ก๊ณผ ๋ฌด๊ดํ๋ค.
# Tip
๋ฐ๋ก ๋ฌธ์ ์ ํ์ ํ์ ํ๊ธฐ ์ด๋ ต๋ค๋ฉด -> ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ ์์ฌํ๊ณ , ํ์์ ์ธ ํด๊ฒฐ๋ฒ ์กด์ฌํ๋์ง ๊ณ ๋ฏผํ๊ธฐ
๋ง์ฝ ๋์ ์ ๋จ์๊ฐ ์๋ก ๋ฐฐ์๊ฐ ์๋ ๊ฒฝ์ฐ๋ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ ์ ์๋ค
(๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์์ ํด๊ฒฐํด์ผ ํจ_8์ฅ)
# 2. ํฐ ์์ ๋ฒ์น
ํฐ์์ ๋ฒ์น
๋ค์ํ ์๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ด ์์ ๋ ์ฃผ์ด์ง ์๋ค์ M๋ฒ ๋ํ์ฌ ๊ฐ์ฅ ํฐ ์๋ฅผ ๋ง๋๋ ๋ฒ์น
๋จ, ๋ฐฐ์ด์ ํน์ ํ ์ธ๋ฑ์ค์ ํด๋นํ๋ ์๊ฐ ์ฐ์ํด์ K๋ฒ์ ์ด๊ณผํ์ฌ ๋ํด์ง ์ ์๋ ๊ฒ์ด ํน์ง
์๋ฅผ ๋ค์ด ์์๋๋ก 2, 4, 5, 4, 6์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ด ์์ ๋, M = 8์ด๊ณ K = 3์ด๋ผ๊ณ ๊ฐ์ ํ์
์ด ๊ฒฝ์ฐ ํน์ ํ ์ธ๋ฑ์ค์ ์๊ฐ ์ฐ์ํด์ ์ธ๋ฒ๊น์ง๋ง ๋ํด์ง ์ ์์ผ๋ฏ๋ก, ํฐ ์์ ๋ฒ์น์ ๋ฐ๋ผ
(6 + 6 + 6) + 5 + (6 + 6 + 6) + 5 = 46์ด ๋๋ค.
๋จ, ์๋ก ๋ค๋ฅธ ์ธ๋ฑ์ค์ ํด๋นํ๋ ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์๋ก ๋ค๋ฅธ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค.
์๋ฅผ ๋ค์ด 3, 4, 3, 4, 3์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ด ์์ ๋, M = 7์ด๊ณ K = 2๋ผ๊ณ ๊ฐ์ ํ์
์ด ๊ฒฝ์ฐ์๋ ๋๋ฒ์งธ์ 4์ ๋ค๋ฒ์งธ์ 4๋ฅผ ๋ฒ๊ฐ์ ๋๋ฒ์ฉ ๊ณ์ฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
(4 + 4) + (4 + 4) + (4 + 4) + 4 = 28
n, m, k = map(int, input().split())
arr = list(map(int, input().split()))
result = 0
arr.sort(reverse=True)
first = arr[0]
second = arr[1]
while True:
for _ in range(k):
if m == 0:
break
result += first
m -= 1
if m == 0:
break
result += second
m -= 1
print(result)
์์ ์์ ๋ M์ด 10,000์ดํ์ด๋ฏ๋ก ์ด ๋ฐฉ์์ผ๋ก๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ง๋ง,
M์ ํฌ๊ธฐ๊ฐ 100์ต ์ด์๋งํผ ์ปค์ง๋ค๋ฉด ์๊ฐ ์ด๊ณผ ํ์ ์ ๋ฐ์ ๊ฒ์ด๋ค.
์ํ์ ์ธ ์์ด๋์ด๋ฅผ ์ด์ฉํด ๋ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํด๋ณด์!
์๋ฅผ ๋ค์ด, N = 5์ด๊ณ , ๋ค์๊ณผ ๊ฐ์ ๋ฐฐ์ด์ด ์๋ค๊ณ ํ์. (2, 4, 5, 4, 6)
first = 6์ด๊ณ second = 5์ด๋ฏ๋ก, M = 8์ด๊ณ K = 3์ผ ๋
(6 + 6 + 6 + 5) + (6 + 6 + 6 + 5) = 46์ผ ๊ฒ์ด๋ค.
์ฆ, ํน์ ํ (K+1๊ธธ์ด์) ์์ด ํํ๋ก ์ผ์ ํ๊ฒ ๋ฐ๋ณตํด์ ๋ํด์ง๋ ํน์ง์ ๊ฐ๋๋ค.
- first๊ฐ ๋ฑ์ฅํ๋ ํ์๋ (M // (K+1)) * N = (8 // 4) * 3 = 6
- second๊ฐ ๋ฑ์ฅํ๋ ํ์๋ M // (K+1) = 8 // 4 = 2
๊ทธ๋ฐ๋ฐ ๋ง์ฝ์ K+1์ด M์ ๋๋์ด ๋จ์ด์ง์ง ์๋ ๊ฒฝ์ฐ๋ ์ด๋ป๊ฒ ํํํ ์ ์์๊น?
์๋ฅผ ๋ค์ด, M = 11์ด๋ผ๊ณ ๊ฐ์ ํ๋ค๋ฉด
(6 + 6 + 6 + 5) + (6 + 6 + 6 + 5) + (6 + 6 + 6) = 54์ด๋ค.
๐ก first๊ฐ ๋ฑ์ฅํ๋ ํ์๋ $$(M//(K+1))*N+M%(K+1)$$
(11 // 4) * 3 + 11 % 4 = 9
๐ก second๊ฐ ๋ฑ์ฅํ๋ ํ์๋ $$M - first ํ์$$
11 - 9 = 2
์ฝ๋๋ฅผ ๋ค์ ์ง๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
n, m, k = map(int, input().split())
arr = list(map(int, input().split()))
result = 0
arr.sort(reverse=True)
first = arr[0]
second = arr[1]
cnt = (m // (k+1)) * k
cnt += m % (k+1)
result += first * cnt
result += second * (m-cnt)
print(result)
๐ก
cnt = (m // (k+1)) * k
cnt += m % (k+1)
# 3. ์ซ์ ์นด๋ ๊ฒ์
์ซ์ ์นด๋ ๊ฒ์
: ์ฌ๋ฌ ๊ฐ์ ์ซ์ ์นด๋ ์ค์์ ๊ฐ์ฅ ๋์ ์ซ์๊ฐ ์ฐ์ธ ์นด๋ ํ ์ฅ์ ๋ฝ๋ ๊ฒ์
๋จ, ๊ฒ์์ ๋ฃฐ์ ์งํค๋ฉฐ ์นด๋๋ฅผ ๋ฝ์์ผ ํ๊ณ ๋ฃฐ์ ๋ค์๊ณผ ๊ฐ๋ค
1. ์ซ์๊ฐ ์ฐ์ธ ์นด๋๋ค์ด N x M ํํ๋ก ๋์ฌ์๋ค. (N: ํ์ ๊ฐ์, M: ์ด์ ๊ฐ์)
2. ๋จผ์ ๋ฝ๊ณ ์ ํ๋ ์นด๋๊ฐ ํฌํจ๋์ด ์๋ ํ์ ์ ํํ๋ค.
3. ๊ทธ ๋ค์ ์ ํ๋ ํ์ ํฌํจ๋ ์นด๋๋ค ์ค ๊ฐ์ฅ ์ซ์๊ฐ ๋ฎ์ ์นด๋๋ฅผ ๋ฝ์์ผ ํ๋ค.
4. ๋ฐ๋ผ์ ์ฒ์์ ์นด๋๋ฅผ ๊ณจ๋ผ๋ผ ํ์ ์ ํํ ๋, ์ดํ์ ํด๋น ํ์์ ๊ฐ์ฅ ์ซ์๊ฐ ๋ฎ์ ์นด๋๋ฅผ ๋ฝ์ ๊ฒ์ ๊ณ ๋ คํ์ฌ ์ต์ข ์ ์ผ๋ก ๊ฐ์ฅ ๋์ ์ซ์์ ์นด๋๋ฅผ ๋ฝ์ ์ ์๋๋ก ์ ๋ต์ ์ธ์์ผ ํ๋ค.
๐ก '๊ฐ ํ๋ง๋ค ๊ฐ์ฅ ์์ ์๋ฅผ ์ฐพ์ ํ์ ๊ทธ ์์์ ๊ฐ์ฅ ํฐ ์'๋ฅผ ์ฐพ๋ ๊ฒ
๋ฆฌ์คํธ์์ ๊ฐ์ฅ ์์ ์์๋ฅผ ์ฐพ์์ฃผ๋ min() ํจ์๋ฅผ ์ด์ฉํ์!
n, m = map(int, input().split())
result = 0
for _ in range(n):
data = list(map(int, input().split()))
min_val = min(data)
result = max(result, min_val)
print(result)
# 4. 1์ด ๋ ๋๊น์ง
์ด๋ ํ ์ N์ด 1์ด ๋ ๋๊น์ง ๋ค์์ ๋ ๊ณผ์ ์ค ํ๋๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ ํํ์ฌ ์ํํ์.
๋จ, ๋๋ฒ์งธ ์ฐ์ฐ์ N์ด K๋ก ๋๋์ด๋จ์ด์ง ๋๋ง ์ ํํ ์ ์๋ค.
1. N์์ 1์ ๋บธ๋ค.
2. N์ K๋ก ๋๋๋ค.
์ด๋, 1๋ฒ ํน์ 2๋ฒ์ ๊ณผ์ ์ ์ํํด์ผ ํ๋ ์ต์ ํ์๋ฅผ ๊ตฌํ๋ผ.
์๋ฅผ ๋ค์ด, N = 17์ด๊ณ K = 4์ผ ๋
- step1) 17 - 1 = 16
- step2) 16 / 4 = 4
- step3) 4 / 4 = 1
๋ค์๊ณผ ๊ฐ์ ์์๋ก ์งํ๋๊ณ ์คํํ ํ์๋ 3ํ์ด๋ค.
๐ก '์ต๋ํ ๋ง์ด ๋๋๊ธฐ'
๋ฐ๋ผ์ ์ด๋ฐ์ ๋๋์ด ๋จ์ด์ง ์ ์์๋งํผ 1์ ๋นผ๊ณ ์ดํ์ ์ฐ์ํด์ ๋๋๊ธฐ๋ฅผ ํ๋ ํธ์ด ์ข์
n, k = map(int, input().split())
cnt = 0
while n >= k:
while n % k != 0:
n -= 1
cnt += 1
# k๋ก ๋๋๊ธฐ
n = n / k
cnt += 1
while n > 1:
n -= 1
cnt += 1
print(cnt)
์์ ๋ฌธ์ ์์๋, N์ ๋ฒ์๊ฐ 10๋ง ์ดํ์ด๋ฏ๋ก, ์ผ์ผ์ด 1์ฉ ๋นผ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
ํ์ง๋ง, N์ด 100์ต ์ด์์ ํฐ ์๊ฐ ๋๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํ์ ๋๋ ๋น ๋ฅด๊ฒ ๋์ํ๋ ค๋ฉด,
N์ด K์ ๋ฐฐ์๊ฐ ๋๋๋ก ํจ์จ์ ์ผ๋ก ํ๋ฒ์ ๋นผ๋ ๋ฐฉ์์ผ๋ก ์์ค์ฝ๋๋ฅผ ์์ ํ ์ ์๋ค.
n, k = map(int, input().split())
cnt = 0
while True:
# target ๋ณ์: ๋๋์ด ์ง๋ ์
target = (n // k) * k
cnt += (n - target)
n = target
# N์ด K๋ณด๋ค ์์ ๋ ๋ ์ด์ ๋๋ ์ ์์ผ๋ฏ๋ก ๋ฐ๋ณต๋ฌธ ํ์ถ
if n < k:
break
cnt += 1
n //= k
# ๋ง์ง๋ง์ผ๋ก ๋จ์ ์์ ๋ํด์ 1์ฉ ๋นผ๊ธฐ
cnt += (n-1)
print(cnt)
๐ก target = (n // k) * k
๋ ์ฝ๋ ๋น๊ต๋ฅผ ๋ณด๋ฉด, ํ์คํ ์ฝ๋๋ฅผ ์์ ํ ํ์์ฑ์ด ์๋ค.

'ํฐ์์ ๋ฒ์น'๊ณผ '1์ด ๋ ๋๊น์ง' ๋ฌธ์ ์ ํ์์ ์ ์ ์๋ฏ์ด
N์ด ํด ๋๋ฅผ ๋๋นํ์ฌ ํ์ ๋ฆฌ๋ฐ์ ์ด๊ณผํ์ง ์๊ธฐ ์ํด
๋ฐ๋ณต๋ฌธ์ ํต๊ณผํ๋ ํ์๋ฅผ ์ค์ด๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ์ ์์๋๋ ๊ฒ์ด ์ค์ํ ๊ฒ ๊ฐ๋ค.
'๐ Study > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] ํ์ ์๊ณ ๋ฆฌ์ฆ DFS, BFS (0) | 2025.04.06 |
---|---|
[Algorithm] ์ต๋จ ๊ฒฝ๋ก (0) | 2025.04.05 |
[Algorithm] ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ (0) | 2025.03.04 |
[Algorithm] ๊ทธ๋ฆฌ๋(Greedy) ์๊ณ ๋ฆฌ์ฆ ๊ธฐ์ถ๋ฌธ์ (0) | 2024.06.26 |
[์๊ณ ๋ฆฌ์ฆ] 2์ฃผ์ฐจ ๊ฐ์ | ์ฐ์ ์์ ํ ADT, ์ ์๋ฆฌ ์ ํ์ ๋ ฌ, ์ ์๋ฆฌ ์ฝ์ ์ ๋ ฌ (2) | 2022.09.10 |