알고리즘/프로그래머스
[프로그래머스] 야근 지수 by 파이썬 (Python)
코딩하는이씨
2023. 8. 6. 17:16
728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/12927
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
난이도
LV 3
문제 설명
해야할 일이 works 배열에 각 일에 대한 필요 작업량이 저장되어 있다.
1시간에 작업량 1만큼을 할 수 있다.
퇴근 시간까지 남은시간 n 이 주어진다.
야근피로도는 퇴근 시간 이후 각 일의 남은 작업량의 제곱의 합이다.
가장 적은 야근 피로도를 계산해서 Return 해야한다.
접근 법
야근 피로도를 가장 낮추는 방법은 모든 일의 작업량을 균등하게 낮추는 것이다.
남은 퇴근시간 n 만큼 많은 작업량이 남은 작업부터 조금씩 줄여 나가야한다.
가장 많은 작업량이 남은 작업을 찾기 위해 heapq를 최대 heap으로 활용한다.
- works를 heapq에 담는다.
- heapq에 가장 앞의 작업이 가장 많은 작업량이 남아있는 작업이므로 퇴근시간 전에 한시간을 해결한다.
- n -= 1을 해서 퇴근시간까지 남은시간을 줄인다.
- 2,3번을 퇴근시간이 될때까지 계속 진행한다.
- n = 0이되면 이제 야근 피로도를 계산해주면된다.
- 만약 0 보다 작은 작업량이 있다면 야근이 없는 경우이다.
- 야근 피로도를 return 해준다.
시간초과 해결
처음에는 heapq를 사용하지 않고 매번 정렬하여 가장 높은 작업량 -=1 을 해주었는데 효율성에서 시간초과가 발생했다.
따라서 어떤 방식으로 하면 시간초과를 해결할 수 있을지 고민하다 최소 힙인 heapq를 최대 힙으로 사용하여 매번 정렬하지 않아도 되도록 설계하면되지 않을까 하여 heapq를 이용해 해결하니 통과하였다.
코드
import heapq
def solution(n, works):
heap = []
for i in works:
heapq.heappush(heap, (-i, i))
answer = 0
while n:
x = heapq.heappop(heap)[1]
x -= 1
heapq.heappush(heap, (-x , x))
n -= 1
for w in heap:
if w[1] < 0:
return 0
answer += w[1] ** 2
return answer
728x90
반응형