파이썬 문제풀이

[프로그래머스 파이썬] 야근 지수

냄비짱 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