코딩테스트/C++
[ 백준 BOJ ] 2343번 - 기타 레슨(C++)
최-코드
2025. 5. 28. 14:33
https://www.acmicpc.net/problem/2343
생각 흐름
- 이분 탐색을 이용해서 블루레이의 크기를 구해준다.
- 이 블루레이 크기에 맞게 M개 이하로 강의들을 짜를 수 있는지 검증해준다.
- 만약 M개 이하로 강의들을 짜를 수 있다면 블루레이의 크기를 줄여주는 방향으로 다시 탐색하고, M개 초과 일시에는 블루레이킈 크기를 크게 하는 방향으로 다시 탐색해준다.
- 주의할 점으로는 각각의 동영상 크기가 블루레이 크기를 넘어가는지 검증해줘야 한다.
#include <iostream>
#include <vector>
using namespace std;
int N, M;
vector<int> v;
int check(int middle){
int c = 1;
int s = 0;
for(int i = 0; i<v.size(); i++){
if(v[i]>middle){
return 2100000000;
}
if(s+v[i]>middle){
c++;
s=0;
}
s+=v[i];
}
return c;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cin>>N>>M;
for(int i = 0; i<N; i++){
int tmp;
cin>>tmp;
v.push_back(tmp);
}
int s=1,t=10000*100000;
int answer=2100000000;
while(s<=t){
int middle = (s+t)/2;
int tmp = check(middle);
if(tmp<=M){
answer=min(answer,middle);
t=middle-1;
}else{
s=middle+1;
}
}
cout<<answer<<endl;
return 0;
}