성우리뷰

징검다리건너기

두원공대88학번뚜뚜 2021. 5. 27. 19:57
#include <string>
#include <vector>
#include <algorithm>

using namespace std;
int sub(vector<int> stones, int mid, int k) {
    int flag = true;
    int less = 0;
    for(int i=0; i<stones.size(); i++) {
        //s[i] <= mid일 때, 건널 수 있음. 따라서, 초기화됨
        if(mid <= stones[i]) {
            less = 0;
        }
        //건널 수 없음
        else {
            //건널 수 없는 만큼 더하고, 만약 이게 k번 반복되면 fasle 리턴
            less++;
            if(less >= k) return false;
        }
    }
    return true;
}
int solution(vector<int> stones, int k) {
    int answer = 0;
    
    int left = *min_element(stones.begin(), stones.end());
    int right = *max_element(stones.begin(), stones.end());
    int mid;
    while(left <= right) {
        mid = (int)(left + right)/2;
        //만약 1이라면, mid만큼의 학생은 건널 수 있는거임
        if(sub(stones, mid, k)) {
            left = mid+1;
                answer = mid;
        }
        //아니라면, mid보다 더 적은 학생이 건널 수 있음
        else {
            right = mid - 1;
        }
    }
    return answer;
}