Closed yeahdy closed 1 month ago
🤔 시간복잡도 고려사항
💡 풀이 아이디어
매개 변수 탐색
→ 특정 조건을 만족하는 최대 or 최솟값을 찾는 이분 탐색Lower Bound
를 찾으면 됨휴게소가 없는 구간
이므로 해당 값을 기준으로 이분 탐색 진행오른쪽 경계를 변경
왼쪽 경계를 출력
비교적 최근에 한번 풀어봤던 문제라 빨리 접근할 수 있었습니다🐹
🤔 시간복잡도 고려사항
💡 풀이 아이디어
스터디하면서 연습했던 이분탐색 문제 유형!
거리 (distance)
거리 (distance)
로 휴게소를 지었을때 갯수가 맞는지 >> canBuild()
canBuild()
: 휴게소간 거리를 배열을 돌며, 해당 거리에 휴게소가 몇개 들어갈 수 있을지 세기
휴게소 간 거리%distance==0
이면, 기존 휴게소랑 겹치기에 -1해주기canBuild()
로 M개 보다 많이 휴게소를 지을 수 있다면, 거리 늘리기 left = distance-1
canBuild()
함수에서 return cnt>M; 조건에=
여부 때문에 시간이 시간이 오래걸렸다..! 이분탐색에서 조건 확인 잘하기!! 그리고 계산의 문제인지, 그냥 ans값을 반환하면 값이 -1 적게 나와서 ans+1값으로 반환해주었습니다..!
🤔 시간복잡도 고려사항
0 <= N <= 50
1 <= M <= 100
100 <= L <= 1000
1 <= 휴게소의 위치 <= L - 1
완전 탐색으로 문제 풀이를 한다면 1000C100
의 경우가 발생할 수 있음. 완전 탐색이 아닌 다른 방법으로 문제풀이해야 함
이진 탐색으로 풀이한다면 O(log1000)
로 풀이 가능
💡 풀이 아이디어
lowerIdx
를 구해야 함int getRestCnt(int dis)
dis
간격일 때, 설치할 수 있는 휴게소의 개수를 구하는 함수(현재 위치 - 이전 위치 - 1) / dis
-1
을 해줌문제에서 요구하는 사항에 따라
upperIdx
를 구해야되는지,lowerIdx
를 구해야되는지 적절하게 따지고 구하기!
🤔 시간복잡도 고려사항
💡 풀이 아이디어
처음에는 단순하게 우선순위 큐를 사용해서 간격의 1/2 지점에 설치할려고 했지만, 휴게소는 여러개 설치될 수 있기 때문에 이는 잘못된 문제 이해였습니다,,,, 문제를 좀 더 꼼꼼히 읽고, 이분탐색 제어 함수와 lower bound, upper bound 찾는 방법을 더 공부해야 할 것 같습니다.... ㅎㅎㅎ
🤔 시간복잡도 고려사항
완전 탐색 시 시간 복잡도 : 950C2 (현재 휴개소가 있는 위치 제외) -> 너무 큼
이분 탐색
으로 시간 복잡도를 줄여줘야함 -> O(log N)
💡 풀이 아이디어 휴게소가 없는 구간의 최댓값의 최솟값을 출력하는 문제 최댓값의 최솟값을 갱신하며 적절한 휴게소의 위치를 찾아야함 -> 이분 탐색
mid
값 기준으로 각 구간을 나누고, mid
값 이하로 만들기 위해 cnt
(필요한 휴게소 개수)를 계산.cnt > M
일 때, left = mid + 1
로 범위를 좁혀 더 큰 구간을 탐색.
cnt <= M
일 때, right = mid - 1
로 범위를 좁혀 더 작은 구간을 탐색.left
반환 🤔 시간복잡도 고려사항
O(NlogN)
정렬O(logL)
이분탐색하기 충분한 시간💡 풀이 아이디어
1 ≤ 휴게소의 위치 ≤ L-1
휴게소의 처음 구간 + 휴게소의 마지막 구간 / 2
buildCount > M
휴게소를 기준 값보다 많이 설치한다면, 최대값에서 최소값을 찾기 때문에 설치 갯수를 줄어야 한다.buildCount <= M
휴게소를 기준 값보다 적게 또는 동일하게 설치한다면, 최대 구간을 찾기 위해 설치 갯수를 늘려야 한다.매개변수, 이분탐색 공부해보고 얘기해보기
이제까지 문제 푼 것들 범위설정 어떻게 했는지 생각해보고, 얘기하는 시간 갖기