[프로그래머스] 야근 지수 - JS

잡초·2024년 1월 23일
0
post-thumbnail

문제

풀이

처음 풀이

function solution(n, works) {
    let answer = 0;
    
    for (let i = 0; i < n; i++) {
        // works 배열에서 최대값의 인덱스를 찾음
        let maxIdx = works.indexOf(Math.max(...works));
        // 최대값의 원소를 1 감소시킴
        works[maxIdx] = works[maxIdx] - 1;
        
        // 만약 최대값이 0이 되면 배열에서 제거
        if (works[maxIdx] === 0) {
            works.splice(maxIdx, 1);
        }
    }
    
    // 남은 작업량을 제곱하여 answer에 더함
    works.forEach(el => {
        answer += el * el;
    });
    
    return answer;
}

틀리진 안았지만, 효율성 테스트를 통과하지 못했다.

function solution(n, works) {
  let answer = 0;

  // 남은 작업량의 합이 n 이하이면 추가 작업 필요 없음
  if (works.reduce((a, b) => a + b) <= n) return 0;

  // 작업량을 내림차순으로 정렬
  works.sort((a, b) => b - a);

  // 남은 작업량이 있을 때까지 반복
  while (n) {
    // 현재 최대 작업량
    let max_num = works[0];

  	// 처음 원소부터 뒤로 가며
  	// 현재 최대값 이상인 값이 있다면 제거해준다.
  	// 따라서 현재 최대값은 계속 처음 위치에 있을 수 있다.
    for (let i = 0; i < works.length; i++) {
      if (works[i] >= max_num) {
        works[i] -= 1;
        n -= 1;
      }
      // 남은 작업량이 0이면 반복 중단
      if (!n) break;
    }
  }

  // 남은 작업의 제곱 합 구하기
  works.forEach((el) => {
    answer += el * el;
  });

  return answer;
}
profile
개발자가 되고싶은 잡초

0개의 댓글