๐ฑ ๋ฌธ์
- ์์ ์ ๋๋ด๊ธฐ๊น์ง ํ์ํ ์ต์ํ์ ํผ๋ก๋๋ฅผ ๊ตฌํ๋ ๋ฌธ์
- ๊ด๋ฌผ์ ๋ชจ๋ ์บ๊ฑฐ๋ ๊ณก๊ฐฑ์ด๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ฉด ์์ ๋๋จ
- ์ด๋ค ๊ด๋ฌผ์ ์ด๋ค ๊ณก๊ฐฑ์ด๋ก ์บ๋์ง์ ๋ฐ๋ผ ์๋ชจ๋๋ ํผ๋ก๋๊ฐ ๋ค๋ฆ
- ํ๋์ ๊ณก๊ฐฑ์ด๋ก 5๊ฐ์ ๊ด๋ฌผ์ ์บ ์ ์์
๐ฑ ํ์ด1 ์์ ํ์ → ์๊ฐ ์ด๊ณผ
์ฒ์์๋ ๊ณก๊ฐฑ์ด(picks
)์ ๊ฐ์๊ฐ ์ต๋ 15๊ฐ ์ด๊ณ , ๊ด๋ฌผ(minerals
)์ ๊ธธ์ด๋ ์ต๋ 50์ด๋ผ ์์ ํ์์ผ๋ก ํ ์ ์๊ฒ ๋ค๊ณ ์๊ฐํ์์ต๋๋ค. ์๋ํ๋ฉด ๊ณก๊ฐฑ์ด 1๊ฐ๋น ๊ด๋ฌผ 5๊ฐ๋ฅผ ์บ ์ ์์ผ๋ฏ๋ก ์ต๋๋ก ํ์ํ ๊ณก๊ฐฑ์ด ์๋ 10๊ฐ์
๋๋ค. ๋, ๊ณก๊ฐฑ์ด ์ข
๋ฅ๋ 3๊ฐ์ด๋ฏ๋ก ๋ชจ๋ ๊ณก๊ฐฑ์ด ์์์ ๊ฒฝ์ฐ์ ์๋ ์ต๋ $3^{10} = 59049$ ๋ผ๊ณ ์๊ฐํ์ฌ ์์ ํ์์ผ๋ก ํ์ด๋ฅผ ํ์๋๋ฐ, 4๊ฐ์ ํ
์คํธ ์ผ์ด์ค์์ ์๊ฐ ์ด๊ณผ๊ฐ ํฐ์ก์ต๋๋ค. (์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋์ง ์์ง ๋ชจ๋ฅด๊ฒ ์,,ใ
ใ
)
# ์๊ฐ ์ด๊ณผ ์ฝ๋
def solution(picks, minerals):
answer = 0
n = len(minerals) // 5
if len(minerals) % 5 != 0:
n += 1
pick_list = []
pick_list += ['dia' for _ in range(picks[0])]
pick_list += ['iron' for _ in range(picks[1])]
pick_list += ['stone' for _ in range(picks[2])]
answer = 25 * 50
if len(pick_list) < n:
n = len(pick_list)
for pick in set(permutations(pick_list, n)):
tiredness = 0
minerals_ = deepcopy(minerals)
for p in pick:
for _ in range(5):
if minerals_:
tiredness += table[p][mineral_dict[minerals_.pop(0)]]
if tiredness < answer:
answer = tiredness
return answer
๐ฑ ํ์ด2 ๊ตฌํ
์ฃผ์ด์ง ํ๋ฅผ ์กฐ๊ธ๋ง ์์ธํ ๋ณด๋ฉด ์์ ํ์์ ํ์ง ์๊ณ ๋ ์ต์ํ์ ํผ๋ก๋๋ฅผ ๊ตฌํ ์ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ์๋ํ๋ฉด ํ์์ ๋ค์ด์๋ชฌ๋ ๊ณก๊ฐฑ์ด๊ฐ ๊ฐ์ฅ ์ ์ ํผ๋ก๋๋ฅผ ์๋ชจํ๊ณ ๋ ๊ณก๊ฐฑ์ด๊ฐ ๊ฐ์ฅ ๋ง์ ํผ๋ก๋๋ฅผ ์๋ชจํ๊ธฐ ๋๋ฌธ์, ๊ฐ์ฅ ๋ง์ ํผ๋ก๋๋ฅผ ์๋ชจํ๋ ๊ด๋ฌผ๋ค์ ๊ฐ์ฅ ์ ์ ํผ๋ก๋๋ฅผ ์๋ชจํ๋ ๊ณก๊ฐฑ์ด ์์๋๋ก ๋งคํ(?)ํด์ฃผ๋ฉด ๋๋ค. ์ฆ, ๊ฐ์ฅ ํผ๋ก๋๋ฅผ ๋ง์ด ์๋ชจํ๋ ๊ด๋ฌผ๊ณผ ๊ฐ์ฅ ํผ๋ก๋๋ฅผ ์ ๊ฒ ์๋ชจํ์ฌ ๊ด๋ฌผ์ ์บ ์ ์๋ ๊ณก๊ฐฑ์ด๋ฅผ ๋งคํ!
1. ์บ ์ ์๋ ๊ด๋ฌผ์ ๊ฐ์
# ์บ ์ ์๋ ๊ด๋ฌผ์ ๊ฐ์
n = min(len(minerals), sum(picks) * 5)
๋จผ์ ์บ ์ ์๋ ๊ด๋ฌผ์ ๊ฐ์๋ฅผ ์นด์ดํธํฉ๋๋ค. ๊ด๋ฌผ์ ๋ชจ๋ ์บ๊ฑฐ๋ ๊ณก๊ฐฑ์ด๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ฉด ์์ ๋๋๋ฏ๋ก ๊ด๋ฌผ์ ๊ฐ์์ ๊ณก๊ฐฑ์ด์ ๊ฐ์ * 5 ์ค์ ๋ ์์ ๊ฐ์ด ์บ ์ ์๋ ๊ด๋ฌผ์ ๊ฐ์๊ฐ ๋ฉ๋๋ค.
2. ๊ด๋ฌผ ์กฐ์ฌ
mineral_count = []
tmp = []
for idx in range(n):
if idx % 5 == 0: # 5๊ฐ๋ง๋ค ์ด๊ธฐํ
if tmp:
mineral_count.append(tmp)
tmp = [0, 0, 0]
if minerals[idx] == "diamond":
tmp[0] += 1
elif minerals[idx] == "iron":
tmp[1] += 1
else:
tmp[2] += 1
if idx == n - 1:
mineral_count.append(tmp)
break
๊ณก๊ฐฑ์ด ํ๋ ๋น ๊ด๋ฌผ์ 5๊ฐ์ฉ ์บ ์ ์์ผ๋ฏ๋ก ์ฃผ์ด์ง ๊ด๋ฌผ๋ค์ 5๊ฐ์ฉ ๋ฌถ์ด์ [diamond ๊ฐ์, iron ๊ฐ์, stone ๊ฐ์]
ํํ๋ก ์ ์ฅํฉ๋๋ค. mineral
์ด ["diamond", "diamond", "diamond", "iron", "iron", "diamond", "iron", "stone"]
์ธ ๊ฒฝ์ฐ, 5๊ฐ์ฉ ๋ฌถ์ผ๋ฉด[["diamond", "diamond", "diamond", "iron", "iron"], ["diamond", "iron", "stone"]]
์ผ๋ก ๋ฌถ์ด๊ณ , mineral_count
๋ [[3, 2, 0], [1, 1, 1]]
์ด ๋ด๊น๋๋ค.
3. ํผ๋ก๋๋ฅผ ๋ง์ด ํ์๋กํ๋ ์์๋๋ก ๊ด๋ฌผ์ ์ ๋ ฌ
mineral_count.sort(key=lambda x: (x[0], x[1], x[2]), reverse=True)
ํผ๋ก๋๋ฅผ ๋ง์ด ์๋ชจํ๋ ๊ด๋ฌผ ์์๋๋ก ์ ๋ ฌํฉ๋๋ค. diamons → iron → stone ์์ผ๋ก ํผ๋ก๋๋ฅผ ๋ง์ด ์๋ชจํ๋ฏ๋ก diamond๊ฐ ๊ฐ์ฅ ๋ง์ ๋ฌถ์, ๊ทธ๋ฆฌ๊ณ iron์ด ๋ง์ ๋ฌถ์ ์์๋๋ก ์ ๋ ฌํฉ๋๋ค. sort()
๋ฉ์๋์ key
์ธ์์ reverse
์ธ์๋ฅผ ์ง์ ํด์ ์ ๋ ฌํ ์ ์์ต๋๋ค.
4. ํผ๋ก๋ ๊ณ์ฐ
while mineral_count:
mineral = mineral_count.pop(0)
if picks[0] > 0:
answer += mineral[0] * 1 + mineral[1] * 1 + mineral[2] * 1
picks[0] -= 1
elif picks[1] > 0:
answer += mineral[0] * 5 + mineral[1] * 1 + mineral[2] * 1
picks[1] -= 1
else:
answer += mineral[0] * 25 + mineral[1] * 5 + mineral[2] * 1
picks[2] -= 1
์ ๋ ฌ๋ ์์๋๋ก ์ฐจ๋ก๋ก ๋ค์ด์๋ชฌ๋ ๊ณก๊ฐฑ์ด, ์ฒ ๊ณก๊ฐฑ์ด, ๋ ๊ณก๊ฐฑ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์บ๋ฉด ๋ฉ๋๋ค. ํผ๋ก๋๋ ํ์์ ์ค ๊ฐ์ผ๋ก ๊ณ์ฐํฉ๋๋ค.
๐ฑ ์ ๋ต ์ฝ๋
def solution(picks, minerals):
answer = 0
# ์บ ์ ์๋ ๊ด๋ฌผ์ ๊ฐ์
if len(minerals) <= sum(picks) * 5:
n = len(minerals)
else:
n = sum(picks) * 5
mineral_count = []
tmp = []
for idx in range(n):
if idx % 5 == 0: # 5๊ฐ๋ง๋ค ์ด๊ธฐํ
if tmp:
mineral_count.append(tmp)
tmp = [0, 0, 0]
if minerals[idx] == "diamond":
tmp[0] += 1
elif minerals[idx] == "iron":
tmp[1] += 1
else:
tmp[2] += 1
if idx == n - 1:
mineral_count.append(tmp)
break
mineral_count.sort(key=lambda x: (x[0], x[1], x[2]), reverse=True)
while mineral_count:
mineral = mineral_count.pop(0)
if picks[0] > 0:
answer += mineral[0] * 1 + mineral[1] * 1 + mineral[2] * 1
picks[0] -= 1
elif picks[1] > 0:
answer += mineral[0] * 5 + mineral[1] * 1 + mineral[2] * 1
picks[1] -= 1
else:
answer += mineral[0] * 25 + mineral[1] * 5 + mineral[2] * 1
picks[2] -= 1
return answer
๋๊ธ