1. ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ
greedy๋ ํ์์ ์ด๋ ๋ป์ด๋ฏ๋ก, ํ์๋ฒ์ด๋ผ๊ณ ๋ ํ๋ค.
์ฆ, ํ์์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํธ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๋ ๋ป์ด๋ค.
์ฌ๊ธฐ์ ํ์์ ์ด๋๊ฒ ๋ฌธ์ ๋ฅผ ํ๋ ํ์ฌ ์ํฉ์์ ๊ฐ์ฅ ์ข์ ๊ฒ๋ง ๊ณ ๋ฅด๋ ๋ฐฉ๋ฒ์ ๋งํ๋ค.
ํ์ฌ์ ์ํฉ๋ง ๊ณ ๋ คํ๊ณ , ํ์ฌ์ ์ ํ์ด ๋์ค์ ๋ฏธ์น ์ํฅ์ ๋ํด์๋ ๊ณ ๋ คํ์ง ์๋๊ฒ ํฐ ํน์ง์ด๋ค.
์ผ๋จ, ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์ ํ์ ๋ค์ํ๊ณ , ๋ง์ ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์ฌ์ ์ง์์ด ํ์ํ ๋ฌธ์ ์ ์๋ ๋ฌธ์ ๋ฅผ ๊ตฌ๋ณํด์ ํ์ด์ผํ๋ค. ํนํ๋, ์ฐฝ์๋ ฅ๊ณผ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํ ์ต์ํ์ ์์ด๋์ด๋ฅผ ๋ ์ฌ๋ฆด ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ถฐ์ผ ํ๋ค.
๋น์ทํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์์ผ ํ๋ 'ํ๋ก์ด๋ ์์ Floyd-Warshall' ํน์ '๋ค์ต์คํธ๋ผDijkstra' ์๊ณ ๋ฆฌ์ฆ์ด ์๋ค.
1. ๊ทธ๋ฆฌ๋ - ๊ฑฐ์ค๋ฆ๋
1280์์ด๋ผ๋ ๋์ด ์๋ค๊ณ ๊ฐ์ ํ์.
์ด ๋์ 500์, 100์, 50์, 10์์ผ๋ก ๊ฑฐ์ฌ๋ฌ ์ฃผ๋ ค๊ณ ํ๋ค.
๊ทธ๋ผ ํ์ํ ๋์ ์ ์ด ๊ฐ์๋?
n = 1280
count = 0
coin_types = [500, 100, 50, 10]
for coin in coin_types:
count += n // coin
n %= coin
print(count)
500์ x 2 , 100์ x 2, 50์ x 1, 10์ x 3
2 + 2 + 1 + 3 = 8๊ฐ
result =>
์๊ฐ ๋ณต์ก๋๋ ํํ์ ์ข ๋ฅ๋งํผ ๋ฐ๋ณตํด์ผ ํ๊ธฐ ๋๋ฌธ์, ๋์ ์ ์ ์ฒด ์ข ๋ฅ์๋ง ์ํฅ์ ๋ฐ๊ณ , ๊ฑฐ์ฌ๋ฌ ์ค์ผํ๋ ๊ธ์ก์ ํฌ๊ธฐ์๋ ๋ฌด๊ดํ๋ค.
2. ๊ทธ๋ฆฌ๋ - ํฐ ์์ ๋ฒ์น
๋ฐฐ์ด์์ ์ฃผ์ด์ง ์๋ค์ m๋ฒ ๋ํ์ฌ, ๊ฐ์ฅ ํฐ ์๋ฅผ ๋ง๋๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋จ, ๋ฐฐ์ด์ ํน์ ํ ์ธ๋ฑ์ค(๋ฒํธ)์ ํด๋นํ๋ ์๊ฐ ์ฐ์ํด์ k๋ฒ์ ์ด๊ณผํ์ฌ ๋ํด์ง ์ ์๋ ๊ฒ์ด ์ด ๋ฒ์น์ ํน์ง์ด๋ค.
์๋ฅผ ๋ค์ด, 2 4 5 4 6 ์ผ๋ก ์ด๋ค์ ธ ์๋ ๋ฐฐ์ด์ด ์๋ค.
m์ด 8์ด๊ณ , k๊ฐ 3์ด๋ผ๊ณ ํ์.
๊ฐ์ฅ ํฐ ์ : 6 , ๋๋ฒ์งธ๋ก ๊ฐ์ฅ ํฐ ์ : 5
6 + 6 + 6 + 5 + 6 + 6 + 6 + 5 = 6*6 + 5*2 = 46 ์ด๋ค
๊ทธ๋ฆฌ๊ณ ์๋ก ๋ค๋ฅธ ์ธ๋ฑ์ค์ ํด๋นํ๋ ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์๋ก ๋ค๋ฅธ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค.
์ฒ์ ์ด ์กฐ๊ฑด์ ๋ฐ์๋ค์ด๋๊ฒ ์ดํด๊ฐ ๋์ง ์์๋ค.
์๋ํ๋ฉด ๊ฐ์ ์๊ฐ ๋์๋๋ฐ ์ ๊ฑฐํ๋๊ฒ ๋ง๋ ์ถ์๋๋ฐ, ์กฐ๊ฑด์ด ์ด๋ ๋ค๋ฉด ๋ฐ๋ฅด์.
์ฆ, 4 5 4 5 4 ๋ก ์ด๋ค์ ธ ์๋ ๋ฐฐ์ด์ด ์์ ๋, m์ด 7์ด๊ณ , k๊ฐ 2๋ผ๊ณ ๊ฐ์ ํ์.
์ด ๊ฒฝ์ฐ, ๋ ๋ฒ์งธ ์์์ ํด๋นํ๋ 5์ ๋ค ๋ฒ์งธ ์์์ ํด๋นํ๋ 5๋ฅผ ๋ฒ๊ฐ์ ๋ ๋ฒ์ฉ ๋ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก 5๊ฐ 7๋ฒ ๋ํด์ง๋, 5 + 5 + 5 + 5 + 5 + 5 + 5 ์ธ 35๊ฐ ๋์ถ๋๋ค.
๋ฐฐ์ด์ ํฌ๊ธฐ N, ์ซ์๊ฐ ๋ํด์ง๋ ํ์์ธ M, ๊ทธ๋ฆฌ๊ณ K๊ฐ ์ฃผ์ด์ง ๋ , ํฐ ์์ ๋ฒ์น์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด๋ณด๋ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์.
์ ๋ ฅ ์กฐ๊ฑด : ์ฒซ์งธ ์ค์ N( 2<= N <= 1,000) , M(1 <= M <= 1,000), K(1 <= K <= 10,000) ์ ์์ฐ์๊ฐ ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ์์ฐ์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ๋ค.
๋์งธ ์ค์ N๊ฐ์ ์์ฐ์๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ์์ฐ์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ๋ค. ๋จ ๊ฐ๊ฐ์ ใ ใ ์ฐ์๋ 1 ์ด์ 10,000 ์ดํ์ ์๋ก ์ฃผ์ด์ง๋ค.
์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ K๋ ํญ์ M๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
์ถ๋ ฅ ์กฐ๊ฑด : ์ฒซ์งธ ์ค์ ํฐ ์์ ๋ฒ์น์ ๋ฐ๋ผ ๋ํด์ง ๋ต์ ์ถ๋ ฅํ๋ค.
์ ๋ ฅ ์์ :
5 8 3
1 3 5 4 6
์ถ๋ ฅ ์์ :
46
* break, continue ๋ฌธ ์ฐจ์ด์ :
break ์ for ๊ณผ while๊ณผ ๊ฐ์ด, ์ ์ด ๋ฃจํ์์ ๋ฒ์ด๋จ, ์์ ํ ๋ฒ์ด๋๋ ๊ฒ์.
continue ๋ ์ ์ด(๋ฐ๋ณต) ํ๋ฆ์ ์ ์งํ ์ํ์์ ํด๋น ์ฝ๋์ ์คํ๋ง ๊ฑด๋๋ฐ๋ ์ญํ ์ ์ํ
break๋ฌธ์ ์ฐ๋ค๋ณด๋ฉด, ์ด๋์์ ์ํฅ์ ๋ฏธ์น๋์ง ํค๊น๋ ธ๋๋ฐ ๋ค์ ์์๋ฅผ ๋ณด๊ณ ํด๊ฒฐ๋์๋ค.
k = 0
while True:
for i in range(50):
k += 1
if i == 5: # i๊ฐ 5์ผ ๋, ๋ฐ๋ณต๋ฌธ์ ๋๋, ์ฌ๊ธฐ์๋ for๋ฌธ
break
if k == 10:
break # k๊ฐ 10์ผ๋ while๋ฌธ์ ๋๋
์ด์ ๋ฌธ์ ๋ฅผ ํผ ์ฝ๋์ด๋ค.
์ฐธ๊ณ ๋ก ์ ๋ ฅ ๊ฐ์ data์ data1 ์ผ๋ก ๊ตฌ๋ถํด๋์ ์ด์ ๊ฐ, ์ด๊ธฐ์ ๋ฐ์ ๊ฐ์ด ์ ๋ ฌ๋๋ ๊ณผ์ ์ ๋ณด๊ณ ์ถ์ด์์ด๋ค.
๊ฐ๋ ์ฑ์ ์ํด์ ๋ฆฌ์คํธ๋ฅผ ๋ณต์ฌํ ๋,
1๋ฒ : data2 = data1[:]
2๋ฒ : data2 = data1.copy()
๋ผ๋ ๋ฐฉ์์ด ์๋๋ฐ 2๋ฒ์ ์จ์ผํ๋ค๋ ๊ฒ์ ๋ฐฐ์ ๋ค.
# n,m,k ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ์ฌ ๋ฐ๊ธฐ
n,m,k = map(int, input().split())
# n๊ฐ์ ๋ฐฐ์ด์ ์๋ค์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์
๋ ฅ ๋ฐ๊ธฐ
data = list(map(int, input().split()))
# ๊ฐ์ฅ ํฐ ์์ ์์ ์๋ฅผ ๋๋ ์ ๋ฐ๊ธฐ, sort ์ฐ๋ฉด ๋ฆฌ์คํธ ํํ ๋ณํ๋จ
# ๊ธฐ๋ณธ์ด reverse = False ์ด๋ค
data1 = data.copy()
data1.sort()
first = data1[n-1] # ๊ฐ์ฅ ํฐ ์
second = data1[n-2] # ๋๋ฒ์งธ๋ก ํฐ ์
result = 0
while True:
for i in range(k): # ๊ฐ์ฅ ํฐ ์๋ฅผ k ๋ฒ ๋ํด์ฃผ๊ธฐ
if m == 0:
break
result += first
m -= 1 # ๋ํ ๋๋ง๋ค m ์ 1์ฉ ๊ฐ์
if m == 0: # m์ด 0์ด๋ผ๋ฉด ๋ฐ๋ณต๋ฌธ ํ์ถ
break
result += second # ๋๋ฒ์งธ๋ก ํฐ ์๋ฅผ ๋ํด์ฃผ๊ธฐ
m -= 1 # ๋ํ ๋๋ง๋ค m์ 1์ฉ ๊ฐ์
print(result)
์ฌ์ฉ๋ ๋ณ์๋ค
๋ฌผ๋ก ์ค์ ์ฝ๋์์๋ data์ data1์ ๋ฐ๋ก ๊ตฌ๋ถํ ํ์๋ ์์ ๊ฒ์ด๋ค
์๋ฅผ ๋ค์ด, 8๊ฐ์ ์ฐ์ฐ์์ k๊ฐ 3์ด๊ธฐ์
(~ + ~ + ~ + ~ ) + (~ + ~ + ~ + ~ )
์ด๋ ๊ฒ ํฌ๊ฒ ๋ ๋ฉ์ด๋ฆฌ๋ก 4๊ฐ์ ํฉ์ด ๋ํด์ง๋ ๋ชจ์ต์ด ๋์๋ค.
ํ์ง๋ง, m๊ณผ k๊ฐ ํ๋ฒ์ ๋จ์ด์ง์ง ์๋ ๊ฒฝ์ฐ๋ ์๊ธธ ์ ์๋ค.
๊ทธ๋ด๋ ์์ ์ฝ๋๊ฐ ์๋ํ์ง ์์ ๊ฒ์ด๋ค.
์ฆ, m์ด k+1 ๋ก ๋๋์ด ๋จ์ด์ง์ง ์๋ ๊ฒฝ์ฐ์์๋ k+1 ๋ก ๋๋ ๋๋จธ์ง๋งํผ ๊ฐ์ฅ ํฐ ์๊ฐ ์ถ๊ฐ๋ก ๋ํด์ง๋ ์ํฉ์ด ์๊ธด๋ค.
์ฆ, ๊ฐ์ฅ ํฐ ์๊ฐ ๋ํด์ง๋ ํ์๋ฅผ ๊ตฌํด์ผํ๋ค.
m์ด 8์ด๊ณ k๊ฐ 4๋ผ๊ณ ๊ฐ์ ํด๋ณด๊ณ , ๊ฐ์ฅ ํฐ ์๊ฐ 6์ด๊ณ ๋๋ฒ์งธ๋ก ํฐ ์๊ฐ 5์ผ๋
( 6 + 6 + 6 + 6 + 5 ) + (6 + 6 + 6 ,..)
๋ง์ง๋ง์ ๊ฐ์ฅ ํฐ ์๊ฐ ๋ํด์ง๋ ๊ฒฝ์ฐ๊ฐ 3๋ฒ์ธ๊ฒ ๋์์ผ ๋๋ค.
๊ธฐ์กด์ ๋ํด์ง๋ ํ์ 4๋ฒ์์ + 3๋ฒ์ธ๊ฒ ๋์์ผ ํ๋ฏ๋ก,
# n,m,k ๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ์ฌ ๋ฐ๊ธฐ
n,m,k = map(int, input().split())
# n๊ฐ์ ์๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ์ฌ ๋ฐ๊ธฐ
data = list(map(int, input().split()))
data.sort(reverse=True)
first = data[0] # ๊ฐ์ฅ ํฐ ์
second = data[1] # ๋๋ฒ์งธ๋ก ํฐ ์
# ๊ฐ์ฅ ํฐ ์๊ฐ ๋ํด์ง๋ ํ์ ๊ณ์ฐ
count = int(m /(k+1)) * k
count += m % (k+1)
result = 0
result += (count) * first # ๊ฐ์ฅ ํฐ ์ ๋ํ๊ธฐ
result += (m-count) * second # ๋๋ฒ์งธ๋ก ํฐ ์ ๋ํ๊ธฐ
print(result)
'๐๏ธ์ํํธ์จ์ด > ๐ปpython' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Python ์๊ณ ๋ฆฌ์ฆ - ๊ตฌํ 1ํ:์ํ์ข์ฐ (0) | 2022.04.20 |
---|---|
Python - ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ ์ ๋ณต 2ํ (0) | 2022.04.20 |
[๋ฐฑ์ค] 10870๋ฒ. ํผ๋ ธ๋์น์ ์ฐพ๊ธฐ(์ฌ๊ท) & ๋ธ๋ฃจํธํฌ์ค - 2798๋ฒ. ๋ธ๋์ญ (0) | 2022.04.08 |
[๋ฐฑ์ค] 1978๋ฒ. ์์ ์ฐพ๊ธฐ (0) | 2022.04.08 |
[๋ฐฑ์ค] 1316๋ฒ. ๊ทธ๋ฃน ๋จ์ด ์ฒด์ปค (0) | 2022.04.08 |