야근 지수

JJW·2024년 12월 14일

코딩 테스트

목록 보기
11/23

문제


문제 풀이

using System;
using System.Linq;

public class Solution {
    public long solution(long n, int[] works) 
    {
        // 업무의 총합 구하기
        long totalWork = works.Sum(w => (long)w);
        
        // 업무의 총합이 n 이하인 경우 모든 업무를 완료할 수 있음
        if (totalWork <= n) 
        {
            return 0;
        }

        // 최대 업무량을 찾음
        int maxWork = works.Max();

        // 빈도 배열 초기화 (0부터 maxWork까지)
        long[] frequency = new long[maxWork + 1];
        foreach (int work in works) 
        {
            // 업무량이 0보다 큰 경우
            if (work > 0) 
            {
                frequency[work]++;
            }
        }

        // 현재 처리할 업무량을 최대 업무량으로 설정
        int currentWork = maxWork;

        while (n > 0 && currentWork > 0) 
        {
            // 0보다 큰 경우
            if (frequency[currentWork] > 0) 
            {
                // 이 업무량의 업무를 모두 처리할 수 있는지 확인
                long available = frequency[currentWork];
                // 얼마나 감소시킬 수 있는지 계산
                long reduce = Math.Min(n, available);
                
                // 업무량을 1 감소시키기
                frequency[currentWork] -= reduce;
                frequency[currentWork - 1] += reduce;
                
                // 남은 야근 횟수 업데이트
                n -= reduce;
            }
            // 현재 업무량을 하나 낮춤
            currentWork--;
        }

        // 야근 지수 계산
        long answer = 0;
        for(int i = 0; i < frequency.Length; i++) 
        {
            answer += frequency[i] * (long)i * (long)i;
        }

        return answer;
    }
}
profile
Unity 게임 개발자를 준비하는 취업준비생입니다..

0개의 댓글