반응형
https://school.programmers.co.kr/learn/courses/30/lessons/42891
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
처음에는 음식을 순회하면서 O(N^2) 문제를 접근했다.
N = 음식, N = 시간
음식은 Set 에 등록하여 다 먹은 음식은 Set 에서 제거하는 방법으로 마지막 음식 ( t + 1 ) 의 index 를 구하여 정확성 테스트를 통과했지만, 효율성 테스트에서는 실패했다.
고민을 하다.. 다른 사람의 아이디어를 도움 받아 n 초 만큼의 음식을 먹는 과정을 O(1) 로 줄일 수 있었다.
아이디어는 음식의 양을 정렬하여 n 초의 시간을 한번에 빼는 방법이다.
위 아이디어를 쓰기 위해서는 최초의 음식 index 와 음식 time 을 관리하는 dict 가 필요하고
n 초가 흐른 시점에 한번에 먹을 수 있는 m 초를 구해야한다.
동시에 먹을 수 있는 음식이 남은 시간 보다 작다면 현 시점에 남아 있는 음식의 index 를 원본 음식 index 로 정렬하여 구하면 된다 ( 처음에 음식 양으로 정렬을 했기에 다 먹은 음식은 자동으로 index 에서 벗어난다 )
function solution(food_times, k) {
var foods = food_times.map((time, idx) => ({ index: idx + 1, time }));
// ascending
foods.sort((a, b) => a.time - b.time);
var n = food_times.length;
var pretime = 0;
for(var i = 0; i < n; i++) {
var spend = (foods[i].time - pretime) * (n - i);
if(spend == 0) continue;
if(spend <= k) {
k -= spend;
pretime = foods[i].time;
} else {
k = k % (n - i);
var temp = [];
for(var j = i; j < n; j++) {
temp.push(foods[j].index);
}
temp.sort();
return temp[k];
}
}
return -1;
}
반응형
'ACM준비 > Programmers' 카테고리의 다른 글
개인정보 수집 유효기간 (0) | 2023.05.10 |
---|---|
올바른 괄호의 갯수 (0) | 2023.01.09 |
쿠키 구입 (0) | 2023.01.09 |
자동완성 (0) | 2022.12.12 |
호텔 방 배정 (0) | 2022.12.03 |