문제
접근 방법
이진탐색으로 최적의 블루레이값을 탐색, count 변수를 설정해 M과 비교
기존 코드
#include <iostream>
#include <vector>
using namespace std;
int N, M;
vector<int> v;
bool isPossible(int x) {
int count = 1, tmp = 0;
for (int i: v) {
tmp += i;
if (tmp > x) {
count++;
tmp = i;
}
if (count > M) return false;
}
return true;
}
int main() {
cin >> N >> M;
v.resize(N);
int max_length = 0;
for (int i = 0; i < N; i++) {
cin >> v[i];
max_length = max(max_length, v[i]);
}
int lft = max_length, rgt = 1000000000;
int best_l = 0;
while (lft<=rgt) {
int mid = (lft+rgt)/2;
if (isPossible(mid)) {
best_l = mid;
rgt = mid - 1;
} else {
lft = mid + 1;
}
}
cout << best_l;
return 0;
}
Chatgpt에게 코드를 점검해본 결과 가독성 부분 개선이 필요, 변수명을 명확히 설정
개선한 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, M;
vector<int> lectures;
bool isPossible(int size) {
int count = 1, current_sum = 0;
for (int len : lectures) {
current_sum += len;
if (current_sum > size) {
count++;
current_sum = len;
}
if (count > M) return false;
}
return true;
}
int main() {
cin >> N >> M;
lectures.resize(N);
int max_length = 0, sum = 0;
for (int i = 0; i < N; i++) {
cin >> lectures[i];
max_length = max(max_length, lectures[i]);
sum += lectures[i];
}
int left = max_length, right = sum;
int result = right;
while (left <= right) {
int mid = left + (right - left) / 2;
if (isPossible(mid)) {
result = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
cout << result;
return 0;
}