
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;
}
}