[Algorithm]_ 마구간 정하기

이지·2021년 10월 24일

algorithm

목록 보기
6/10

이분 검색 알고리즘 문제.. 주로, 최소 혹은 최대 라는 표현이 등장한다.

N개의 마구간이 수직선상에 있습니다. 각 마구간은 x1, x2, x3, ......, xN의 좌표를 가지며, 마구간 간에 좌표가 중복되는 일은 없습니다.
현수는 C마리의 말을 가지고 있는데, 이 말들은 서로 가까이 있는 것을 좋아하지 않습니다. 각 마구간에는 한 마리의 말만 넣을 수 있고, 가장 가까운 두 말의 거리가 최대가 되게 말을 마구간에 배치하고 싶습니다.
C마리의 말을 N개의 마구간에 배치했을 때 가장 가까운 두 말의 거리가 최대가 되는 그 최대 값을 출력하는 프로그램을 작성하세요.


//count 함수에서는 다음 마구간과 그 전의 마구간 사이의 간격 (차) 을 구한 후, 값이 mid 보다 크거나 같으면 시작점을 stable[i]로 변경하고, 그렇지 않으면 다음 칸으로 이동한다. 
function count(stable, dist){
               let cnt=1, ep=stable[0];
               for(let i=1; i<stable.length; i++){
                   if(stable[i]-ep>=dist){
                       cnt++;
                       ep=stable[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);
  //전체 배열과 mid 값을 인수로 받는 count 함수를 만든다. 만약 값이 주어진 말의 수보다 크면,
//간격을 조금 더 넓혀도 된다는 의미이므로, lt를 mid+1 로 증가시킨다. 
                    if(count(stable, mid)>=c){
                        answer=mid;
                        lt=mid+1;
                    }
//반대로 말의 수가 작으면 간격을 좁혀야한다. (rt를 왼쪽으로 이동) 
                    else rt=mid-1;
                }
                return answer;
            }

            let arr=[1, 2, 8, 4, 9];
            console.log(solution(3, arr));
profile
이지피지레몬스퀴지🍋

0개의 댓글