처리해야 될 작업의 개수 n과, 각 코어의 처리시간이 담긴 배열 cores 가 매개변수로 주어질 때, 마지막 작업을 처리하는 코어의 번호를 return 하는 solution 함수를 완성해주세요.
제한 사항
코어의 수는 10,000 이하 2이상 입니다.
코어당 작업을 처리하는 시간은 10,000이하 입니다.
처리해야 하는 일의 개수는 50,000개를 넘기지 않습니다.
처음에는 간단한 문제인줄알고 값을 다 더해서 빼는것도 생각해봤으나 문제를 자세히 보니 시간마다 코어를 처리해야하는것이었다. 물론 이렇게하면 시간초과에 걸리게된다.
결국 시간에대한 문제는 이분탐색이다. 여기서는 무엇을 조건으로 해야하는지가 중요한데 자세히 보면 시간에 따른 문제 해결방식이 가장 편하게 할수있는방법이다.
코드(실패)
import java.util.*;
class Solution {
public int solution(int n, int[] cores) {
if(n<cores.length) return n;
int answer = 0;
for(int i=1;i<10001;i++){
for(int j=0;j<cores.length;j++){
if(cores[j]%i==0) n--;
}
if (n==0) return i;
if(i==10000) i=1;
}
return -1;
}
}
코드(이분탐색)
import java.util.*;
class Solution {
public int solution(int n, int[] cores) {
if(n<cores.length) return cores.length-n;
int answer = 0;
int right= cores[1]*n;
int left= 1;
int time=0;
int m =0;
while(true){
int mid = (right+left)/2;
int count= cores.length;
if(mid != 0){
for(int i=0;i<cores.length;i++){
count += (mid/cores[i]);
}
}
if(right<left) break;
//작업량>=n일때
if(count>=n){
right = mid - 1;
time = mid;
m = count;
}else{
left = mid + 1;
}
}
m = m - n;
for(int i = cores.length-1; i>=0; i--){
if (time % cores[i] == 0) {
if (m == 0) {
answer = i+1;
break;
}
m--;
}
}
return answer;
}
}//이분탐색
결국 작업량이 n보다 크게 해서 가장 가까운 값을 찾은후 그 m값보다 작은 마지막 코어를 찾아야하므로 역순으로 answer를 찾아 출력하면된다.