마인은 곡괭이로 광산에서 광석을 캐려고 합니다. 마인은 다이아몬드 곡괭이, 철 곡괭이, 돌 곡괭이를 각각 0개에서 5개까지 가지고 있으며, 곡괭이로 광물을 캘 때는 피로도가 소모됩니다. 각 곡괭이로 광물을 캘 때의 피로도는 아래 표와 같습니다.
예를 들어, 철 곡괭이는 다이아몬드를 캘 때 피로도 5가 소모되며, 철과 돌을 캘때는 피로도가 1씩 소모됩니다. 각 곡괭이는 종류에 상관없이 광물 5개를 캔 후에는 더 이상 사용할 수 없습니다.
마인은 다음과 같은 규칙을 지키면서 최소한의 피로도로 광물을 캐려고 합니다.
즉, 곡괭이를 하나 선택해서 광물 5개를 연속으로 캐고, 다음 곡괭이를 선택해서 광물 5개를 연속으로 캐는 과정을 반복하며, 더 사용할 곡괭이가 없거나 광산에 있는 모든 광물을 캘 때까지 과정을 반복하면 됩니다.
마인이 갖고 있는 곡괭이의 개수를 나타내는 정수 배열 picks
와 광물들의 순서를 나타내는 문자열 배열 minerals
가 매개변수로 주어질 때, 마인이 작업을 끝내기까지 필요한 최소한의 피로도를 return 하는 solution 함수를 완성해주세요.
picks
는 [dia, iron, stone]과 같은 구조로 이루어져 있습니다.minerals
의 길이 ≤ 50minerals
는 다음 3개의 문자열로 이루어져 있으며 각각의 의미는 다음과 같습니다.picks | minerals | result |
---|---|---|
[1, 3, 2] | ["diamond", "diamond", "diamond", "iron", "iron", "diamond", "iron", "stone"] | 12 |
[0, 1, 1] | ["diamond", "diamond", "diamond", "diamond", "diamond", "iron", "iron", "iron", "iron", "iron", "diamond"] | 50 |
def solution(picks, minerals):
answer = 0
m_lst = [minerals[i:i+5] for i in range(0,len(minerals),5)]
costs = []
for m in m_lst:
cost = [0,0,0] # 다이아, 철, 돌 곡괭이 사용시 피로도
for i in m:
if i == "diamond":
cost[0] += 1
cost[1] += 5
cost[2] += 25
elif i == 'iron':
cost[0] += 1
cost[1] += 1
cost[2] += 5
elif i == 'stone':
cost[0] += 1
cost[1] += 1
cost[2] += 1
costs.append(cost)
else:
if len(costs) > sum(picks):
costs.pop()
# picks[0]: dia, picks[1]: iron, picks[2]: stone
costs.sort(key=lambda x:x[2], reverse=True)
for c in costs:
if picks[0] > 0:
answer += c[0]
picks[0] -= 1
continue
if picks[1] > 0:
answer += c[1]
picks[1] -= 1
continue
if picks[2] > 0:
answer += c[2]
picks[2] -=1
continue
return answer
DFS로 푸신 분들이 많던데.. minerals
크기가 50까지이기 때문에 그리디로도 충분히 풀릴 것 같아서 그리디로 풀이했다.