티스토리 뷰

알고리즘

43. 뮤직비디오

홍복치 2020. 12. 17. 21:26

인프런 - it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 강의를 바탕으로 공부한 내용입니다.

문제는 비공개로 입력예제와 출력예제만을 가지고 포스팅

 

 

입력예제 1

9 3

1 2 3 4 5 6 7 8 9

 

출력예제 1 

17

 

풀이 

- DVD 3개만으로 9개의 곡을 나누어 담아야함 

-모든 곡을 담을 때 필요한 용량은 1+2+3+4+5+6+7+8+9 즉, (9+10)/2인 45

- 1~45사이에 DVD한개의 최소 용량이 있다

- 정답이라고 유추한 mid값은 항상 maxx값 보다 커야 한다(DVD는 배열에서 가장 큰 용량을 가진 노래를 담을 수 있어야 하기 때문) 

 

ex) 1+45/2 = 23

(1,2,3,4,5,6),(7,8),(9)

-> res = 23, rt=22

 

23보다 더 작은 수가 최소 용량이 될 수 있음

-> rt를 mid-1 후 이분탐색함



#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int a[1001], n;
// 43. 뮤직비디오(결정 알고리즘)

//필요 DVD 리턴
int Count(int s){
    int i, cnt=1, sum=0;
    for(i=1;i<=n;i++){
        if(sum+a[i]>s){
            cnt++; //DVD추가
            sum=a[i]; //초과된 DVD부터 sum count
        }
        else{
            sum+=a[i];
        }
    }
    return cnt;
}


int main() {
    int m, i, lt=1, rt=0, mid, res, maxx=-2147000000;
    scanf("%d %d", &n, &m);
    for(i=1;i<=n;i++){
        scanf("%d", &a[i]);
        rt=rt+a[i];
        if(a[i]>maxx) maxx=a[i]; //배열 중 가장 큰 값 찾기(DVD는 가장 큰 용량을 담을 수 있어야 함)
    }
    while(lt<=rt){
        mid=(lt+rt)/2; //dvd한 개의 최소 용량
        if(Count(mid)<=m && mid>=maxx){
            res=mid;
            rt=mid-1;
        }else{
            lt=mid+1;
        }
    }
    printf("%d\n",res);
    return 0;
}
 

'알고리즘' 카테고리의 다른 글

45. 공주구하기  (0) 2020.12.21
44. 마구간 정하기  (0) 2020.12.18
24. 이분검색  (0) 2020.12.16
19. 분노유발자  (0) 2020.04.17
18. 층간소음  (0) 2020.04.17
최근에 올라온 글
Total
Today
Yesterday