
처음 봤을때 k의 값이 long이고 효율성이 들어있어서 k를 이용한 배열이나 for문 순회는 효율성을 통과하지 못할것 같았다.
따라서 hashmap을 통해서 시간에 따른 몫의 개수를 구해서 그 값이 k값보다 커질때를 구해서 그 전값으로 순회를 돌리면 될것같았다.
코드
import java.util.*;
class Solution {
public int solution(int[] food_times, long k) {
int cycleLength= food_times.length;
long foodSum = 0;
for (int i = 0; i < cycleLength; i++) {
foodSum += food_times[i];
}
if (foodSum <= k) return -1;
HashMap<Integer,Integer> num = new HashMap<>();
for(int food:food_times){
num.put(food,num.getOrDefault(food,0)+1);
}
int count=0;
long total = 0;
int length = 0;
while (total <= k) {
if(num.containsKey(count)){
length= num.get(count);
}else{
length=0;
}
cycleLength-=length;
total += cycleLength;
count++;
}
long a =k-(total-cycleLength);
for(int i=0;i<food_times.length;i++){
if(count<=food_times[i]){
if(a==0){
return i+1;
}else{
a--;
}
}
}
return 0;
}
}
이러한 방법으로 풀기는 했지만 우선순위 큐를 통해서 값을 구하는 방법도 있었고
몫과 나머지를 이용한 풀이방법도 있었다. 특히 몫과 나머지를 이용한 풀이방법이 최적화가 제대로 된 모습이었다.