파이썬 문제풀이
[프로그래머스 파이썬] 야근 지수
냄비짱
2024. 1. 18. 17:05
728x90
📌문제 출처
프로그래머스 LV 3
https://school.programmers.co.kr/learn/courses/30/lessons/12927
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
❓ 문제
📗 풀이 코드
'''
야근피로도를 가장 줄이기 위해서는 가능한 모든 작업을 골고루 진행해서 최대값과 최소값의 차이를 줄여야한다.
works에 -를 붙이고 heap 정렬을 시킨다.
heappop으로 최대값을 뽑아내어 남은 것들 중 최대값보다 1이 작을때까지 일하기를 반복하자.
'''
from heapq import heapify, heappush, heappop
def solution(n, works):
works = list(map(lambda x : -x, works))
heapify(works)
while n and len(works)>=2 : # 야근 시간이 남아있고 작업 종류가 2개 이상이라면
a = heappop(works)
b = works[0]
if n < b-a+1: # 야근 시간이 최대값을 차대값-1까지 만들만큼 충분하지 않다면
heappush(works,a+n) # a를 n만큼 일하고 heappush
return sum(map(lambda x : x**2,works)) # 모든 일을 다했으므로
n -= b-a+1 # 야근하기
a = b+1
if a: # a가 작업량이 남았다면(b가 1짜리 일인 경우)
heappush(works,a)
if n == 0 : # 작업 종류가 2개 이상인데 야근 시간이 없는 경우
return sum(map(lambda x : x**2,works))
# 야근 시간은 있는데 작업 종류가 1개인 경우
a = works[0]
return ((a+n)**2) if n < -a else 0