(프로그래머스) 172927. 광물 캐기
[unrated] 광물 캐기 - 172927
성능 요약
메모리: 10.1 MB, 시간: 0.03 ms
구분
코딩테스트 연습 > 연습문제
채점결과
Empty
문제 설명
마인은 곡괭이로 광산에서 광석을 캐려고 합니다. 마인은 다이아몬드 곡괭이, 철 곡괭이, 돌 곡괭이를 각각 0개에서 5개까지 가지고 있으며, 곡괭이로 광물을 캘 때는 피로도가 소모됩니다. 각 곡괭이로 광물을 캘 때의 피로도는 아래 표와 같습니다.
예를 들어, 철 곡괭이는 다이아몬드를 캘 때 피로도 5가 소모되며, 철과 돌을 캘때는 피로도가 1씩 소모됩니다. 각 곡괭이는 종류에 상관없이 광물 5개를 캔 후에는 더 이상 사용할 수 없습니다.
마인은 다음과 같은 규칙을 지키면서 최소한의 피로도로 광물을 캐려고 합니다.
- 사용할 수 있는 곡괭이중 아무거나 하나를 선택해 광물을 캡니다.
- 한 번 사용하기 시작한 곡괭이는 사용할 수 없을 때까지 사용합니다.
- 광물은 주어진 순서대로만 캘 수 있습니다.
- 광산에 있는 모든 광물을 캐거나, 더 사용할 곡괭이가 없을 때까지 광물을 캡니다.
즉, 곡괭이를 하나 선택해서 광물 5개를 연속으로 캐고, 다음 곡괭이를 선택해서 광물 5개를 연속으로 캐는 과정을 반복하며, 더 사용할 곡괭이가 없거나 광산에 있는 모든 광물을 캘 때까지 과정을 반복하면 됩니다.
마인이 갖고 있는 곡괭이의 개수를 나타내는 정수 배열 picks
와 광물들의 순서를 나타내는 문자열 배열 minerals
가 매개변수로 주어질 때, 마인이 작업을 끝내기까지 필요한 최소한의 피로도를 return 하는 solution 함수를 완성해주세요.
제한사항
picks
는 [dia, iron, stone]과 같은 구조로 이루어져 있습니다.- 0 ≤ dia, iron, stone ≤ 5
- dia는 다이아몬드 곡괭이의 수를 의미합니다.
- iron은 철 곡괭이의 수를 의미합니다.
- stone은 돌 곡괭이의 수를 의미합니다.
- 곡괭이는 최소 1개 이상 가지고 있습니다.
- 5 ≤
minerals
의 길이 ≤ 50minerals
는 다음 3개의 문자열로 이루어져 있으며 각각의 의미는 다음과 같습니다.- diamond : 다이아몬드
- iron : 철
- stone : 돌
입출력 예
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 |
입출력 예 설명
입출력 예 #1
다이아몬드 곡괭이로 앞에 다섯 광물을 캐고 철 곡괭이로 남은 다이아몬드, 철, 돌을 1개씩 캐면 12(1 + 1 + 1 + 1+ 1 + 5 + 1 + 1)의 피로도로 캘 수 있으며 이때가 최소값입니다.
입출력 예 #2
철 곡괭이로 다이아몬드 5개를 캐고 돌 곡괭이고 철 5개를 캐면 50의 피로도로 캘 수 있으며, 이때가 최소값입니다.
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
from itertools import permutations
from math import ceil
def calculate(pick_idx, minerals):
array = [[1,1,1],[5,1,1],[25,5,1]]
pick_score = array[pick_idx]
result = [a * b for a,b in zip(pick_score, minerals)]
return sum(result)
# def solution(picks, minerals):
# picks_ls = [0] * picks[0] + [1] * picks[1] + [2] * picks[2]
# n_pickable = min(5 * sum(picks), len(minerals))
# n_picks = ceil(n_pickable / 5) # 실제 사용해야할 곡괭이 수
# answer = []
# for pick_comb in list(set(permutations(picks_ls, n_picks))):
# pick_comb = list(pick_comb)
# cnt = 0
# minerals_comb = minerals[:n_pickable]
# pick = pick_comb.pop(0)
# picked = 0
# while minerals_comb:
# cnt += calculate(pick, minerals_comb.pop(0))
# picked += 1
# if picked == 5 and minerals_comb:
# pick = pick_comb.pop(0)
# picked = 0
# answer.append(cnt)
# return min(answer) >> 시간초과 !
def solution(picks, minerals):
picks_ls = [0] * picks[0] + [1] * picks[1] + [2] * picks[2]
n_pickable = min(5 * sum(picks), len(minerals))
minerals = minerals[:n_pickable]
answer = []
# 우선순위 정렬 ! (5개 단위)
works = []
for i, m in enumerate(minerals):
div, mod = divmod(i, 5)
if mod == 0:
works.append([0,0,0])
if m == "diamond":
works[div][0] += 1
elif m == "iron":
works[div][1] += 1
else:
works[div][2] += 1
works.sort(key=lambda x:[x[0],x[1],x[2]], reverse=True)
# print(works)
answer = 0
for work in works:
pick = picks_ls.pop(0)
answer += calculate(pick, work)
return answer
# picks = [1, 0, 1]
# minerals = ["iron", "iron", "iron", "iron", "diamond", "diamond", "diamond"]
# print(solution(picks,minerals))
Leave a comment