728x90
반응형
https://www.acmicpc.net/problem/2805
2805번: 나무 자르기
첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보
www.acmicpc.net
1. Logic
스탠다드한 이분탐색 문제이다. 주의할 점은 문제에서 포커스를 맞춰야 할 곳이 절단기에 설정할 높이를 구하는 것이고, 절단기에 설정한 높이를 나무의 길이에서 빼준 값으로 비교해야 한다는 점이다.
이분탐색이 이해가 잘 안간다면 아래의 알고리즘 설명글을 참고하면 좋을 것 같다!
https://go2gym365.tistory.com/87
[Algorithm] 이분탐색 / Binary Search
1. 이분탐색이란? 이분 탐색 알고리즘은 정렬되어 있는 배열에서 탐색 범위를 절반씩 줄여가며 데이터를 탐색하는 알고리즘이다. 이분탐색은 결정 문제의 답이 이분적일 때 사용할 수 있는데 대
go2gym365.tistory.com
2. Code
#include<bits/stdc++.h>
using namespace std;
int n, m;
long long ans = LLONG_MAX;
vector<int> input;
long long calc(int mid) {
long long sum = 0;
for(int i = 0; i < n; i++) {
if(input[i] > mid)
sum += input[i] - mid;
}
return sum;
}
long long binarySearch() {
int low = 0;
int high = input[n - 1];
int mid;
while(low <= high) {
mid = (low + high) / 2;
long long temp = calc(mid);
if(temp >= m) {
low = mid+1;
}
else {
high = mid-1;
}
}
return high;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n >> m;
for(int i = 0; i < n; i++) {
int a;
cin >> a;
input.push_back(a);
}
sort(input.begin(), input.end());
cout << binarySearch();
}
3. Feedback
이분탐색이 어떻게 돌아가는지는 이해갔는데 그 안에서 low값과 high값을 출력하는 부분에 대해 헷갈리는 부분이 생겼다. 이부분에 대해 다시 살펴봐야겠다.
알고리즘 Solve 후 제가 생각한 Logic을 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분등은 언제든지 댓글로 틀린 부분 및 피드백 주시면 공부 및 반영하겠습니다🧐
728x90
반응형
'Algorithm > Beakjoon' 카테고리의 다른 글
[백준/Baekjoon] 12100 2048(easy) C++ :: Implementation (0) | 2023.09.26 |
---|---|
[백준/Baekjoon] 9252 LCS2 C++ :: Dynamic programming (0) | 2023.09.26 |
[백준/Baekjoon] 2565 전깃줄 C++ :: Dynamic Programming (0) | 2023.09.24 |
[백준/Baekjoon] 2473 세 용액 C++ :: Two pointer (0) | 2023.09.24 |
[백준/Baekjoon] 2568 전깃줄-2 C++ :: LIS(nlogn) (0) | 2023.09.23 |