본문 바로가기

프로그래머스/이분탐색

징검다리 - Level4

728x90

programmers.co.kr/learn/courses/30/lessons/43236

 

코딩테스트 연습 - 징검다리

출발지점부터 distance만큼 떨어진 곳에 도착지점이 있습니다. 그리고 그사이에는 바위들이 놓여있습니다. 바위 중 몇 개를 제거하려고 합니다. 예를 들어, 도착지점이 25만큼 떨어져 있고, 바위가

programmers.co.kr

#include <string>
#include <vector>
#include<algorithm>

using namespace std;

int solution(int distance, vector<int> rocks, int n) {
    int answer = 0;
    
    
    sort(rocks.begin(), rocks.end());
    
    int left =0;
    int right = distance;
    
    while(left <= right){
        
        
        int mid = (left+right)/2; // mid는 최솟값을 정하는 것 
        
        int cnt =0;   // mid가 최소값이 되기 위해서 없애야하는 바위의 수 
        int prev = 0; //이전 바위의 위치 
       
        for(int i=0; i<rocks.size(); i++){
            
            if(rocks[i]-prev < mid){cnt++;} // 다른 바위의 사이 거리가 mid 값보다 작은 경우에는 없애야하는 바위의 수를 증가 시킨다.
            else{prev = rocks[i];} // 만약에 없애도 되지 않은 경우에는 이전 바위의 위치를 바꾸어준다. 
            
        }
        
        if(distance-rocks[rocks.size()-1]<mid){cnt++;} //마지막 바위와 마지막 사이의 거리도 mid 값과 비교해본다. 
        
        if(cnt<=n){ // 없애야할 바위수가 n개보다 작거나 같을 때 -> mid가 더 큰 수일 경우를 탐색해야 함.
            answer = mid;
            left = mid+1;
        }
        else{  // mid 가 더 작은 수일 경우를 탐색해야함 .
            right = mid-1;
        }
        
        
        
    }

    
    
    return answer;
}

'프로그래머스 > 이분탐색' 카테고리의 다른 글

길찾기게임 - 이진탐색(전위,후위)  (0) 2021.03.09
징검다리 건너기  (0) 2021.03.04
입국심사  (0) 2021.02.10
예상 대진표  (0) 2021.01.06