Closed Jewan1120 closed 1 month ago
🤔 시간복잡도 고려사항
💡 풀이 아이디어
이분탐색
이분탐색 변수 조절
이런 유형의 이분탐색은 항상 이분탐색 떠올리고 시간초과되는 조합으로 시도하는 이상한 습관이 있다... 더 연습 많이하기..
🤔 시간복잡도 고려사항
O(lonN)
으로 풀이 가능💡 풀이 아이디어
s
, e
를 조절하는 기준을 가능한 두 지점 사이의 최소 거리
로 설정int tmp
: 가능한 두 지점 사이의 최소 거리int s = 0
, e = distance
while(s <= e) {
tmp 값 구하기
// 최소 길이가 middle가 될 수 있을 때
// 제거해야되는 최소 돌의 개수
int tmp = removeCnt(rocks, m, distance);
// 제거해야되는 돌의 개수가 주어진 값보다 같거나 작으면
// 현재 값이 작아서 다른 큰 값들이 많다는 의미
// 현재 값의 크기를 키워줘야 됨
if(tmp <= n) {
answer = m;
s = m + 1;
// 제거해야 되는 돌의 개수가 주어진 값보다 크다면
// 해당 값보다 작은 값들이 많아서 작은 거리을 없애기 위해 돌을 많이 없애야 된다는 의미
// 현재 값을 줄여줘야 됨
} else {
e = m - 1;
}
}
어떤걸 기준으로 해야되는지 고민을 많이 했습니당,,또 최소 돌의 개수를 구하는 것도 어떻게 해야되는지,, ㅠ 소프티어 문제랑 비슷한거 같은데, 다시 풀어도 어렵네요,,,ㅠ 이분 탐색 진짜 이번에 확실하게 넘어가야겠어요,,, 감으로 문제푸는 버리잣 ,,,,,,,,,,!!!
🤔 시간복잡도 고려사항
이분 탐색
💡 풀이 아이디어
이분 탐색을 위해 정렬
각 바위 사이의 최소 거리
n개 이하
라면 값 갱신
🔗 비슷한 문제
옛날에 풀었던 문제라 다시 한번 복기할 겸 풀어봤는데 어렵네요.. 아이디어 없으면 힘들었던 문제였습니다.
🤔 시간복잡도 고려사항
💡 풀이 아이디어
mid 값이 실제 바위들 간의 거리와 같아야 한다는 것에만 집중에서 숲을 보지 못했던 것 같습니다,,,,,, 이분탐색,,,,,, 크고 자세하게 보자
🤔 시간복잡도 고려사항 시간 복잡도 : n:10억, O(log N)
💡 풀이 아이디어
바위를 n개 제거한 뒤 각 지점 사이의 거리의 최솟값 중에 가장 큰 값 mid
거리가 일정하고 바위 순서가 바뀌지 않음 -> 이분탐색 사용
이분탐색 구조
while(left <= right){
int mid = (left + right)/2;
if(getRemovedRock(rocks, mid, distance) <= n){ // 바위 제거 개수가 작으면
answer = mid;
left = mid + 1;
} else{
right = mid -1;
}
}
바위 제거 함수 : 몇개의 바위를 제거해야 하는지 계산
public int getRemovedRock(int[] rocks, int mid, int distance){
int before =0; // 출발지점
int end = distance; // 도착지점
int removeCnt = 0; // 제거한 바위 개수
for(int i=0; i<rocks.length; i++){
if(rocks[i] - before < mid){ // 현재 바위와 이전 위치 사이의 거리가크면
removeCnt++; // 바위 제거
}
else before = rocks[i]; // 바위 유지, 이전 위치를 현재 바위로 업데이트
}
if(end - before < mid) // 마지막 구간도 mid보다 짧으면 바위 제거
removeCnt++;
return removeCnt;
}
시간 복잡도를 고려할 때 이분 탐색을 떠올렸으나, 바위 제거를 이분 탐색으로 어떻게 구현 해야할 지 되게 막막했었습니다. 현재 바위 위치와 비교해서 갱신하는 것도 어려웠고,,, 더 연습해야겠습니다 ㅠ.ㅠ
🤔 시간복잡도 고려사항
O(logN)
💡 풀이 아이디어