본문 바로가기

프로그래머스/구현

[구현] 프로그래머스 '야근 지수' - js

반응형

1. 문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

2. 코드

이 문제를 보고 "아, 이건 요소들의 값을 고르게 해야하는 문제구나! " 까지는 파악했다. "근데 이걸 어떻게 하지?" 가 문제였다. while 문 안에 for문을 쓰지 말아야한다는 강박에 갇혀... while이랑 for 둘 중 하나만 쓰는 방식을 생각하다가 도저히 각이 안나오는 것이다.. 어떻게 둘 중 하나만 쓰고 이걸 처리해!? 하고 구글링을 해봤더니... 둘 다 사용해도 효율성 테스트에 통과하는 것을 보게 되었다. 엥? 둘 다 써도 되나보네?! 

이 문제의 핵심은 요소 간 편차를 고르게 해주는 것이다. 그게 전부다.

function solution(n, works) {
	// 예외처리. 일의 총합이 n보다 작거나 크면 야근 지수가 0
    if(works.reduce((a,c) => a += c) <= n) return 0;
    // 모든 요소의 편차를 줄여주기 위해 오름차순으로 정렬해 
    // 큰 값이 뒤로 가게 해줌(내림차순도 가능할 듯)
    let sorted = works.sort((a,b) => a-b);
  
    while(n) {
    	// 항상 배열 속 큰 값을 max 변수에 저장하고,
        const max = sorted[works.length-1];
    	// 배열을 순회하며 max값보다 크거나 같은 요소들을 -1해주며 요소 간 편차 줄여줌
        for(let i = works.length-1; i >= 0; i--) {
            if(sorted[i] >= max) {
                sorted[i]--;
                n--;
            }
            // 만약 n을 다 썼으면 break
            if(!n) break;
        }
    }
  
    return sorted.reduce((a,c) => a + Math.pow(c, 2), 0);
}

 

되도록 while안에는 for를 쓰지 않는 것이 좋지만, 방법이 도저히 생각나지 않으면 마음 가는대로 먼저 해봐야겠다. 겁먹지 말기.

이해에 참고한 블로그)

https://velog.io/@longroadhome/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-LV.3-%EC%95%BC%EA%B7%BC-%EC%A7%80%EC%88%98-JS

 

[프로그래머스] LV.3 야근 지수 (JS)

회사원 Demi는 가끔은 야근을 하는데요, 야근을 하면 야근 피로도가 쌓입니다. 야근 피로도는 야근을 시작한 시점에서 남은 일의 작업량을 제곱하여 더한 값입니다. Demi는 N시간 동안 야근 피로도

velog.io

 

복기

6/2
반응형