January 09, 2021
무지는 음식 하나를 1초 동안 섭취한 후 남은 음식은 그대로 두고, 다음 음식을 섭취한다.
function solution(food_times, k) {
let foods = food_times
.map((time, idx) => {
return { id: idx + 1, time }
})
.sort((a, b) => a.time - b.time)
while (foods.length) {
const foodCount = foods.length
const food = foods.shift()
if (foodCount * food.time <= k) {
k -= foodCount * food.time
foods = foods.map(f => {
return { id: f.id, time: f.time - food.time }
})
} else {
foods.unshift(food)
const foodIdx = k === 0 ? 0 : k % foods.length
const sorted = foods.sort((a, b) => a.id - b.id)
return sorted[foodIdx].id
}
}
return -1
}
시간초과가 발생한다.
효율성 테스트 제한사항을 살펴보면 k = 2 x 10^13
이다.
걸리는 점
k를 소거 후에 모든 요소에서 소거된 k만큼 time을 삭제하고 있다.
k가 저만큼 커진다면 js에서 다룰 수 있을지 모르겠다.
Number.MAX_SAFE_INTEGER
는 2 x 10^13
보다 크다.function solution(food_times, k) {
let foods = food_times
.map((time, idx) => {
return { id: idx + 1, time }
})
.sort((a, b) => a.time - b.time)
let eatAll = 0
for (let i = 0; i < foods.length; i++) {
const foodCount = foods.length - i
const food = foods[i]
if (foodCount * (food.time - eatAll) <= k) {
k -= foodCount * (food.time - eatAll)
eatAll = food.time
} else {
const foodIdx = k === 0 ? 0 : k % foodCount
const sorted = foods.slice(i).sort((a, b) => a.id - b.id)
return sorted[foodIdx].id
}
}
return -1
}
K
연산을 하던 부분을 삭제foods
를 queue
로 다루던 것을 for
문으로 변경