[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/알고리즘 연습

[알고리즘 연습] 콘서트 동영상 저장하기

inu 2021. 1. 21. 21:59
반응형

라이브 동영상

  • N(1<N<1000)개의 노래를 부른 콘서트의 라이브 동영상을 끊어서 M(1<M<N)개의 DVD에 저장하려고 한다.
  • 노래 순서는 처음 주어진 상태에서 변경하면 안된다.
  • 각 노래의 시간이 분단위로 주어진다. (최대 10000분)
  • 각 DVD의 저장시간은 동일하다.
  • 이 때 N개의 노래를 M개의 DVD에 담을 수 있는 DVD의 최소 용량을 구하시오(용량은 분단위로 표현)
  • ex. N=9, M=3, (1,2,3,4,5,6,7,8,9)로 값이 주어졌을 경우 : 3개의 DVD용량이 17분짜리이면 (1, 2, 3, 4, 5) (6, 7), (8, 9) 이렇게 3개의 DVD로 저장할 수 있다. 17분 용량보다 작은 용량으로는 3개의 DVD에 모든 영상을 저장할 수 없다. 따라서 답은 17.

풀이

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> a;
int n;

int Count(int s) {
    int i, cnt=1, sum=0;
    for(i=0;i<n;i++) {
        if (a[i]>s) {
            return 10001;
        }
        if(sum+a[i]>s) {
            cnt++;
            sum=a[i];
        } else {
            sum+=a[i];
        }
    }    
    return cnt;
}

int main() {
    int m, i, temp, start=1, end=0, mid, res;
    cin>>n>>m;

    for(i=0;i<n;i++) {
        cin>>temp;
        a.push_back(temp);
        end+=temp; 
    }

    while(start<=end) {
        mid=(start + end)/2;
        if(Count(mid)<=m) {
            res=mid;
            end=mid-1;
        } else {
            start=mid+1;
        }
    }    

    cout << res;

    return 0;
}
  • 결정알고리즘과 이진탐색을 응용하여 해결한다. (결정알고리즘 : 답을 결정해놓고 해당 답이 문제의 조건에 맞는지 확인하여 해결하는 방법)
  • 결국 DVD 용량의 답은 1~노래길이의총합 사이에 있을 것이므로 그를 응용하여 이진탐색을 실시한다.
  • mid값이 정답이 될 수 있는지 Count 함수를 사용해 확인한다. Count 함수는 해당 DVD 용량을 사용했을 때 최소 몇개의 DVD가 필요한지 리턴하는 함수이다. 이를 M값과 비교해서 같거나 작다면 가능한것으로 처리한다.
  • 해당 과정을 모두 마쳤을 때의 res값이 최소용량이된다.
  • 문제가 조금만 복잡해도 자꾸 더 쉬운방법을 찾으려는 습관이 있다. 빠르게 구현가능한 정도라면 거기까진 구현해보자.
  • 결정 알고리즘은 잘 활용할 수 있을 것같으니 익혀두자.
반응형