Closed icegosimperson closed 1 month ago
🤔 시간복잡도 고려사항
이분 탐색
혹은 매개 변수 탐색
💡 풀이 아이디어
매개 변수 탐색의 UpperBound
를 출력
private static boolean isPossible(int param) {
int cnt = 1;
int prev = 0; // 마지막으로 공유기가 설치된 집의 인덱스
for (int i = 1; i < n; i++) {
// 마지막으로 설치된 집과의 거리가 param보다 크다면 공유기 설치
if (arr[i] - arr[prev] >= param) {
cnt++;
prev = i;
}
}
// 많이 설치되도 됨 -> 몇 개 지워버리면 되니깐
return cnt >= c;
}
🤔 시간복잡도 고려사항
💡 풀이 아이디어
🤔 시간복잡도 고려사항
💡 풀이 아이디어
이분탐색
: 가능한 최대 거리 mid 구하기결정조건
: canWifi()
현재 집 - 이전 집
의 거리가 설정한 dist보다 크거나 같으면 공유기 설치 🤔 시간복잡도 고려사항
2 <= 집의 개수 <= 200,000
이기 때문에 집에 대해 이중 반복문 사용 XO(NlogN)
) 💡 풀이 아이디어
UpperBound
int s, e, m
: 공유기 사이의 거리 조절int cnt
: 설치해야되는 공유기 개수int getCnt(int m, int[] arr)
: 설치해야되는 공유기의 개수를 구하는 함수🤔 시간복잡도 고려사항
시간 복잡도 : N, C <= 200,000 xi <= 10^9 -> 이분 탐색 시간 복잡도를 줄여줘야함 -> O(N logN)
💡 풀이 아이디어
while(s <= e){
int first = houses[0];
int count = 1;
int m = (s+e)/2; // mid = 공유기 사이의 최소 거리
for(int i=1; i<N; i++){
if(houses[i] - first >= m){
count++;
first = houses[i];
}
}
if(count>=C){ // 공유기를 더 설치할 수 있는 경우
ans = m;
s = m+1;
} else e = m-1;
}
🤔 시간복잡도 고려사항
10^5
O(logN)
으로 풀이가능💡 풀이 아이디어
mid
값을 기준으로 거리 간격을 조정하기 때문에 거리의 최대값 후보가 됨mid
값이 최적의 거리의 최대값이 되도록 함while(left <= right)
left = mid + 1
right = mid-1