728x90
https://programmers.co.kr/learn/courses/30/lessons/64062
n이 20만이고 각 배열의 최댓값(m)은 2억이다.
따라서 매번 모든 배열에 -1을 빼주면서 k개 이내의 돌다리를 건너는 게 가능한지 확인하는 방법은 시간 초과가 날 것이다.
따라서 파라매트릭 서치를 사용했다. 이분 탐색으로 몇 번째에 건너지 못하는지를 찾는 것이다.
그렇게 되면 건너는 게 가능한지 확인하는 O(n) * 적당한 값을 이분 탐색하는 logm이므로 O(nlogm)에 해결이 가능하다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool isOk(vector<int> tempStone, int mid, int k){
int zeroCount = 0;
for(int i = 0 ; i < tempStone.size() ; i++){
tempStone[i] -= (mid-1);
if(tempStone[i] <= 0)
zeroCount++;
else
zeroCount = 0;
if(zeroCount == k)
return false;
}
return true;
}
int solution(vector<int> stones, int k) {
int answer = 0;
int l = 0, r = *max_element(stones.begin(), stones.end()+1);
while(l<=r){
int mid = (l+r)/2;
if(isOk(stones, mid, k)){
l = mid + 1;
}
else{
r = mid -1;
}
}
return r;
}
728x90
'문제 풀이 > 프로그래머스 알고리즘, SQL' 카테고리의 다른 글
[프로그래머스 2018 KAKAO BLIND RECRUITMENT 3차] 방금 그곡 (문자열, ) [C++] (0) | 2022.01.11 |
---|---|
[프로그래머스 위클리 챌린지] 피로도 (완전탐색, next_permutation) [C++] (0) | 2022.01.04 |
[프로그래머스 2019 카카오 개발자 겨울 인턴십] 불량 사용자 (DFS, 조합) [C++] (0) | 2021.10.07 |
[프로그래머스 2021 Dev-Matching: 웹 백엔드 개발자 상반기 SQL] 헤비 유저가 소유한 장소 (0) | 2021.10.06 |
[프로그래머스 위클리 챌린지 6주차] 복서 정렬하기 (정렬) [C++] (0) | 2021.09.07 |