본문 바로가기
Algorithm(C++)/이진탐색

[BOJ - 2343] 기타 레슨(C++)

by alswns8081 2025. 2. 9.

  문제

 

  접근 방법

 

이진탐색으로 최적의 블루레이값을 탐색, 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;
}

 

  링크

2343번: 기타 레슨