function count(stable, dist){
let cnt=1, ep=stable[0];
for(let i=1; i<stable.length; i++){
if(stable[i]-ep>=dist){
//stable의 1번째부터 끝까지 가면서 0번째를 뺐을 때
//왜 차이가 mid를 기준으로?
cnt++;
ep=stable[i]; //기준을 i번째로 만든다
//다음 거리를 구하기 위해
}
}
return cnt;
}
function solution(c, stable){
let answer;
stable.sort((a, b)=>a-b);
let lt=1;//가능한 가장 작은 값
let rt=stable[stable.length-1];//가능한 가장 큰 값
while(lt<=rt){
let mid=parseInt((lt+rt)/2); //중간값 (충족하지 않으면 계속 2로 나눈 몫)
if(count(stable, mid)>=c){//count가 c와 같거나 크면
answer=mid;//answer를 mid로 만들고 이상으로 넘긴다
lt=mid+1;
}
else rt=mid-1;
}
return answer;
}
let arr=[1, 2, 8, 4, 9];
// 1 2 4 8 9
console.log(solution(3, arr));
말과 말 사이의 거리를 기준으로 //mid
해당 거리만큼 마구간 사이를 띄운 채 말을 마구간에 배정했을 때 //count함수
주어진 말의 수만큼 전체 마구간에 넣을 수 있으면 //count함수의 결과 >= c
해당 거리를 반환하는 것이 문제의 핵심이다.
말 사이의 거리는 1번 마구간과 stable.length-1번 마구간에 말이 들어갈 때 최대다.
말이 2마리 이상이면 말 사이의 거리는 무조건 최댓값 이하다.
그러므로 최댓값/2로 mid값을 정해준다.
그리고 count함수에서 실제로 마구간에 사람이 말을 넣어줄 때처럼,
stable 배열의 첫번째 마구간 번호에 말을 넣었을 때 mid만큼 거리를 두고 다음 마구간에 말을 넣어줄 경우 주어진 말의 수만큼 마구간에 모두 넣을 수 있는지 확인한다.
stable을 for문으로 돌면서 i번째 마구간과 ep(endpoint, 즉 마지막으로 정해준 마구간의 번호)번째 마구간의 거리가 dist(mid)보다 같거나 큰지 확인한다. 같거나 크면 i번째 마구간을 새로운 ep로 만들어서 거기서부터 다음 마구간까지의 거리가 mid보다 같거나 큰지 확인한다.
다음에 cnt(넣을 수 있는 말의 개수)가 주어진 말의 개수인 c보다 같거나 크면 answer에 mid를 넣고 mid+1을 한다. 만약 c보다 작으면 cnt를 늘이기 위해 rt를 줄인다.