ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 코딩테스트 - 야근 지수
    코딩테스트 풀이 2024. 11. 11. 11:45
    728x90

    문제 설명

    회사원 Demi는 가끔은 야근을 하는데요, 야근을 하면 야근 피로도가 쌓입니다. 야근 피로도는 야근을 시작한 시점에서 남은 일의 작업량을 제곱하여 더한 값입니다. Demi는 N시간 동안 야근 피로도를 최소화하도록 일할 겁니다.Demi가 1시간 동안 작업량 1만큼을 처리할 수 있다고 할 때, 퇴근까지 남은 N 시간과 각 일에 대한 작업량 works에 대해 야근 피로도를 최소화한 값을 리턴하는 함수 solution을 완성해주세요.

    제약 사항

    • works는 길이 1 이상, 20,000 이하인 배열입니다.
    • works의 원소는 50000 이하인 자연수입니다.
    • n은 1,000,000 이하인 자연수입니다.

    해결 방법

    아이디어

    남은 작업량의 편차를 최대한 줄이는 것이 중요하다. 수는 제곱이 될수록 차이가 커기기 때문에 작업량이 큰 작업을 1시간씩 줄이는 방식으로 진행해야 한다.

    • 남은 시간 > 남은 작업량이라면 0 반환
    • 남은 작업량 내림차순으로 정렬
    • 남은 시간동안 작업 반복
      • 첫 작업의 시간을 max로 지정
      • 첫 작업과 max보다 작업량이 큰 작업을 모두 1시간씩 작업
        • => 항상 첫 작업이 가장 긴 작업량을 가짐
    • 남은 작업량 제곱해서 더하기

    코드

    function solution(n, works) {
        if (works.reduce((acc,curr) => acc + curr, 0) <= n) return 0
        
        works.sort((a, b) => b - a);
        
        while (n) {
            const max = works[0];
            for (let i = 0; i < works.length; i++) {
                if (!n || works[i] < max) {
                    break;
                }
                works[i]--;
                n--;
            }
        }
                 
        return works.reduce((acc,curr) => acc + curr ** 2, 0);
    }

    첫 코드에서는 while문 안에서 남은 작업을 정렬하고, 가장 긴 작업과 그 다음 작업의 차이만큼 마이너스를 해줬는데 그렇게하다보니 작업량이 늘어날수록 시간 초과 오류가 나는 것을 확인할 수 있었다. 그래서 정렬하지 않아도 되도록 수정했다.

    결과

    728x90

    댓글

Designed by Tistory.