danbibibi
article thumbnail

문제

문제 바로가기> BOJ 2343번: 기타 레슨

 

2343번: 기타 레슨

강토는 자신의 기타 강의 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 강의가 들어가는데, 블루레이를 녹화할 때, 강의의 순서가 바뀌면 안 된다. 순서가 뒤바뀌는 경

www.acmicpc.net

 

풀이

매개 변수 탐색을 이용해서 가능한 블루레이의 크기 중 최소를 구하는 문제다.

주의할 점은 상한(high)을 설정하는 부분이다.

처음에 high를 10,001으로 설정했는데 바로 틀렸다,,

생각해보니, 각 강의의 길이가 10,000분을 넘지 않는 것이지,

블루레이의의 크기는 당연히 10,000분을 넘을 수 있기 때문!! 이 부분을 주의해 줘야 할 것 같다!

 

각 강의당 길이가 10,000분이므로, 10000*100000 = 10억이고,

따라서 이분탐색을 하지 않고 brute-force 방식으로 문제를 해결하면 시간초과가 발생한다!

 

#include<iostream>
#define MAX 100001
#define INF 1000000001 // 10000 * 100000
using namespace std;

int video[MAX];
int N, M, ans = 0; 
int low = 0, high = INF;

void input() {
	cin >> N >> M;
	for(int i = 0; i < N; i++) cin >> video[i];
}

bool check(int size) { //  블루레이 제한 크기
    int s = 0, cnt = 0; // 현재 크기, 블루레이 개수
    for(int i=0; i<N; i++){
        if(size < video[i]) return false; // 담을 수 없음
        if(size < s+video[i]){
            cnt++;
            s = video[i];
        }
        else s+=video[i];
    }
    if (s > 0) cnt += 1;
    if (cnt <= M) return true;
    return false;
}

void solution() { // 가능한 블루레이 크기중 최소를 출력 (매개변수 탐색)
	while (low <= high) {
		int mid = (low + high) / 2;
		if (check(mid)) high = mid - 1; // 블루레이의 크기를 더 낮춰도 됨
		else low = mid + 1; // 블루레이의 크기를 더 늘려야 함
	} cout << low;
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	input();
	solution();
}

'문제 풀이 > 백준' 카테고리의 다른 글

BOJ 17471번: 게리맨더링  (0) 2023.02.23
BOJ 2110번: 공유기 설치  (0) 2023.02.23
BOJ 6987번: 월드컵  (0) 2023.02.22
BOJ 16974번: 레벨 햄버거  (0) 2023.02.21
BOJ 2531번: 회전초밥  (0) 2023.02.21
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로