*이 글은 2022년 1월~2월 노션으로 진행한 알고리즘 스터디를 옮긴 글입니다. 나동빈 저자 이것이 취업을 위한 코딩테스트다를 사용해 학습했습니다.
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> datas;
int main() {
int n, m, a, b;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a;
datas.push_back(a);
}
sort(datas.begin(), datas.end());
cin >> m;
for (int i = 0; i < m; i++) {
cin >> b;
*if (binary_search(datas.begin(), datas.end(), b)) cout << "yes" << endl;
else cout << "no" << endl;
}*
return 0;
}
#include<iostream>
#include<vector>
using namespace std;
vector<int>datas;
int main() {
int n, m, a;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> a;
datas.push_back(a);
}
int h = 1;
int answer;
do {
answer = 0;
for (int i = 0; i < n; i++) {
int k=datas[i] - h;
if (k <= 0)k = 0;
answer += k;
}
h++;
} while (answer >= m);
cout << h;
return 0;
}
이건 h값을 이진탐색으로 찾는 방법. 이진탐색 파트인데 하루 지났다고 어떤 문제인지 추론하는 것도 실패함 ㅋ_키;
혼자서 꼭 다시풀기. 이진탐색 코드에 익숙해지기.
using namespace std;
#include<vector>
#include<iostream>
// 떡의 개수(N)와 요청한 떡의 길이(M)
int n, m;
// 각 떡의 개별 높이 정보
vector<int> arr;
int main(void) {
cin >> n >> m;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr.push_back(x);
}
// 이진 탐색을 위한 시작점과 끝점 설정
int start = 0;
int end = 1e9;
// 이진 탐색 수행 (반복적)
int result = 0;
while (start <= end) {
long long int total = 0;
int mid = (start + end) / 2;
for (int i = 0; i < n; i++) {
// 잘랐을 때의 떡의 양 계산
if (arr[i] > mid) total += arr[i] - mid;
}
if (total < m) { // 떡의 양이 부족한 경우 더 많이 자르기(왼쪽 부분 탐색)
end = mid - 1;
}
else { // 떡의 양이 충분한 경우 덜 자르기(오른쪽 부분 탐색)
result = mid; // 최대한 덜 잘랐을 때가 정답이므로, 여기에서 result에 기록
start = mid + 1;
}
}
cout << result << '\n';
}