arr[i] 는 각각 i번째 노동자의
품질,월급을 나타내는quality,wage배열이 주어진다
가장 최소한의 비용으로k명을 고용할때 드는 비용을 구하여라조건
- i번째 노동자를 고용하려면,
최소 wage[i] 보다 돈을 많이줘야됨- 각 작업자의 월급은, quality에 정비례해야 함
quality가 얼마던 간에 최소한의 비용이면 상관없음ㅋㅋ
가장 중요한건, 기준으로 삼을 작업자를 정하는 것이다
가장 효율적인 노예 작업자를 순서로 정렬한다 (돈을 적게 받고, 능률은 뛰어난 )
i번 노예는, 무조건 i+1번 노예가 받는 돈을 기준으로 했을때 만족하게 된다
효율적인 순서대로 k명을 뽑는다.
이러면, 우리는 가장 효율적인 k을 고르게 된다
사실, 효율은 정답과는 아무 상관이 없다.
노예1이 노예2에 비해 아무리 효율이 좋아도, 노예2가 퀄리티가 낮아 돈을 덜 받으면 노예 2를 써야 한다
점점 비효율적인 얘들을 차례로 탐색하며, 최소값을 구한다
사실, 효율적인 놈들 대신 비효율적인 애들을 쓸 경우는
퀄리티가 너무 높아서, 효율이 좋은데도 돈을 많이 받는 경우이다따라서, 현재 뽑은 사람들 중 퀄리티가 제일 높은놈을 제외하고, i번째 비효율적인 놈 에 맞춰서 계산을 할 때, 총 월급이 더 적게 드는지를 계산하여 업데이트하면 된다.
class Solution:
def mincostToHireWorkers(self, quality: List[int], wage: List[int], k: int) -> float:
worker_len = len(quality)
efficent_arr = sorted(
[ (wage[i]/quality[i], quality[i]) for i in range(worker_len) ]
)
max_heap , all_quality =[],0
for i in range(k): #(k개를 만족하는)가장 효율적 경우부터
all_quality += efficent_arr[i][1]
heapq.heappush( max_heap, - efficent_arr[i][1] )
answer = efficent_arr[i][0] * all_quality # 가장 효율적인 팀은 구성했을때의 총 금액
# 비 효율적이여도, quality가 낮으면, 필요한 돈은 오히려 적을 수 있음
for i in range(k, worker_len):
ith_worker_efficent, ith_worker_quality = efficent_arr[i][0], efficent_arr[i][1]
# 가장 높은 quality를 대채한 후, [i]번째 효율적인 놈을 기준으로 계산하여 정답 업데이트
most_quality = -heapq.heappop(max_heap)
all_quality -= most_quality
all_quality += ith_worker_quality
heapq.heappush(max_heap,-ith_worker_quality)
answer = min(answer, ith_worker_efficent*all_quality)
return answer