[결정 알고리즘]마구간 정하기

해피데빙·2022년 6월 11일
0

코딩테스트

목록 보기
13/52
post-custom-banner

            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를 줄인다.

profile
노션 : https://garrulous-gander-3f2.notion.site/c488d337791c4c4cb6d93cb9fcc26f17
post-custom-banner

0개의 댓글