Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
🔗 문제 링크
나무 자르기 =>🌳🪓
✔️ 소요된 시간
1시간 + @
✨ 수도 코드
🌳1. 문제 선정 이유🌳
저번 준서님 PR을 보고 이분탐색에 대해 공부해볼 수 있었습니다. 원래도 어떤 자료구조인지는 알고있었지만... 문제를 풀어본 적은 없어서 한번 풀어보고 싶었습니다. 그래서 이번에 나무 자르기 라는 문제로 풀어보게 되었습니다.
🌳2. 문제 설명🌳
1) 🪓설명🪓
2)🪓문제 예시🪓
3)🪓입출력🪓
4)🪓조건🪓
🌳3. 이분 탐색🌳
-> 선택한 중앙값을 기준으로, 찾고자 하는 값(H의 최대 길이)보다 크다면 기준의 왼쪽 범위에서 찾고, 찾고자 하는 값보다 작다면 기준의 오른쪽 범위에서 다시 중앙값을 선택하여 반복합니다.
검색이 반복될 때마다 목푯값을 찾을 확률이 2배가 되기 때문에 속도가 빠릅니다.
한 번 비교할 때마다 범위가 1/2로 줄어듭니다.
0~1,000,000,000의 이미 정렬된 데이터에서 사용할 수 있습니다.
이분 탐색의 최악의 시간 복잡도는 **O(logn)**으로 로그함수의 기울기가 매우 완만해, 데이터의 크기가 아무리 커져도 탐색에 필요한 시간은 매우 완만하게 증가합니다.
🌳4. 문제 풀이 방법🌳
1) 🪓N, M 입력 받기, N개의 나무들의 각각 높이 입력 받기🪓
2) 🪓can_cut함수 구현🪓
-> 이때, total은 자료형이 int형이 아닌 long long형 입니다.
=> total값은 N개의 나무들 각각의 높이에서 H의 길이 만큼을 뺀 값들이 더해져 있는 값입니다. 그런데, 문제에서 나와있듯이 나무의 높이의 합 total은 항상 M보다 크거나 같습니다. 따라서 M의 값이 최대값인 2,000,000,000이라면 total의 값은 2,000,000,000보다 크거나 같으므로 범위가 -2,147,483,648~2,147,483,647인 int형은 total의 자료형으로 적합하지 않습니다. 따라서 범위가 훨씬 더 큰 long long형으로 해주어야 합니다.
3) 🪓binary_search 함수 구현🪓
0 <= H <= 1,000,000,000
를 만족하는 모든 H에 대해서 탐색해야 합니다.-> 그러나, 범위 내의 모든 H를 탐색하게 되면, 시간이 매우 오래 걸리기 때문에, _이분 탐색_을 이용할 것입니다.
4) 🪓binary_search 함수를 통해 반환된 lo의 값을 result 변수에 저장 후, 출력합니다.🪓
🌳4. 최종 코드🌳
최종 코드
📚 새롭게 알게된 내용
long long자료형을 사용해야 할 때가 있다는 것을 알게 되었습니다. 자료형의 범위를 글로만 배워보았지 실제 알고리즘 문제를 풀면서 적용해본 적이 없어 감이 잘 오지 않았는데, 언제 사용해야 하는지 알게되었습니다.
리스트를 입력받았을 때, 정렬되어 있어야 이분 탐색을 사용할 수 있다고 배웠어서 그런지, 문제에서 lo, hi를 제가 직접 정해주고 이분 탐색을 이용해 풀려고 하니 이해가 잘 되지 않아 처음에 힘들었지만, 이런 식으로 문제에 적용할 수 있다는 것을 알게되었습니다.