[프로그래머스 Lv3] 선입 선출 스케줄링

이재윤·2024년 12월 27일

https://school.programmers.co.kr/learn/courses/30/lessons/12920

1) 코드

def solution(n, cores):
    
    if n <= len(cores):
        return n
    else:
        n -= len(cores)
        left = 1
        right = max(cores)*n 
        
    
    while left < right: 
        mid = (left+right) // 2 
        
        capacity = 0 
        
        for c in cores:
            capacity += (mid // c)
    
        if capacity >= n:
            right = mid 
        else:
            left = mid+1 
            
    for c in cores:
        n -= (right-1) // c 
        
    
    for i in range(len(cores)):
        if right % cores[i] == 0:
            n -= 1
            if n == 0:
                return i+1 

2) 해설
https://dev-note-97.tistory.com/173
이 블로그를 참고해서 풀었다

  • 처음에는 우선순위 큐를 2개써서 풀었으나,
    테스트 케이스만 통과하고, 답을 맞히지 못했다
  • 이후에 블로그를 참고해서, 답을 작성했다
  • 이분탐색을 통해, 전체 작업을 처리하는데 필요한 최소 시간을 효과적으로
    구할 수 있다는 것이 이 문제의 핵심이다
  • 또한, 해당 최소 시간을 구하면,
    for c in cores:
    n -= (right-1) // c
    를 통해서 해당 최소 시간 이전의 작업을 모두 처리하고,
    그 다음에 다시 cores 리스트를 순회하면서,
    해당 인덱스를 찾았다
  • 높은 수준의 응용력과 개념화 능력이 필요한 문제라고 생각한다.

0개의 댓글