티스토리 뷰

반응형

안녕하세요,

 

오늘은 한 스타트업의 코딩테스트를 진행했었는데.. 3문제를 2시간안에 풀어야 했지만.. 한문제 효율성 박살난 풀이와.. 손도 못댄 2문제..

 

커다란 벽을 느껴버렸습니다..

 

좀 더 열심히 해야겠다는 생각이 간절하게 드는 하루입니다..

 

그래서 가져온 야근 지수 난이도 3 문제인데요.. 주관적인 풀이를 공유하고자 합니다!


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


제한 사항

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

입출력 예

works n result
[4, 3, 3] 4 12
[2, 1, 2] 1 6
[1,1] 3 0

우선 이 문제같은 경우에는

 

간단하게 한 리스트에서 최대값만 알고있다면, 최대값을 매번 -1 해주는 방식으로 진행하면 쉽게 해결할 수 있습니다!

 

/////// 에러 코드 입니다!!!

function solution(n, works) {

  for (let i = 0; i < n; i++) {
    const max = Math.max(...works)
    const index = works.indexOf(max)

    works[index]--
  }
  if (works.find((item => item < 0))) return 0

  return works.reduce((acc, cur) => acc + cur * cur, 0);
}

이렇게 정리할 수 있습니다!

 

하지만 위는 정답이 될 수 없죠.. 바로 효율성이 박살나게 됩니다... 생각을 해보니 Math.max또한 매번 최대값을 찾기위해 돌것 같다는 생각..

 

그렇기에 Math.max를 사용하지 않고 어떻게 하면 할 수 있을까? 라고 생각하던 찰나에, 매번 큰 수를 뽑을 이유가 있을까? 라는 생각을 하게 되었습니다.

 

큰 수를 매번 뽑지말고, 계산 전에 미리 한번 정렬을 한 후, 정렬된 0번째 인덱스를 가지고 비교하면서 하면 어떨까? 라는 생각을 하고 개발을 진행해보았습니다.

 

function solution(n, works) {
  if (works.reduce((acc, cur) => acc + cur) <= n) return 0
  works = works.sort((a, b) => b - a)

  while (n) {
    const max = works[0]
    for (let i = 0; i < works.length; i++) {
      if (works[i] >= max) {
        works[i]--
        n--
      }
      if (n === 0) break
    }
  }

  return works.reduce((acc, cur) => acc + cur * cur, 0);
}

위와 같은 코드로 개발을 하니까.. 엄청 빠르게 성공을 주더군요..

 

효율성을 챙기기 위한 다른 방식도 있다.. 는 것을 인지하고 해야겠군요...

 

도대체 언제쯤 되어야 코딩테스트를 잘할 수 있을까.. 나는 감자다.. 감자다.... 감자다........

 

한솔방울 깃허브

 

이상 감사합니다!!

반응형