본문 바로가기
알고리즘

Programmers - 광고삽입(C++)

by 장중앙 2021. 8. 24.

https://programmers.co.kr/learn/courses/30/lessons/72414

 

코딩테스트 연습 - 광고 삽입

시간을 나타내는 HH, H1, H2의 범위는 00~99, 분을 나타내는 MM, M1, M2의 범위는 00~59, 초를 나타내는 SS, S1, S2의 범위는 00~59까지 사용됩니다. 잘못된 시각은 입력으로 주어지지 않습니다. (예: 04:60:24, 11

programmers.co.kr

풀이

완전 탐색의 경우 O(N(전체 구간 길이) x M(광고의 길이))

시간을 초단위로 1초씩 이동 -> 구간의 합을 계산 O(N)으로 계산

1. logs에 대해 초로 변환, 시작 - 끝 값에 대해 재생 사람수 카운트

2. 0~(동영상 길이-광고 길이)에 대해 한 칸씩 슬라이딩을 옮기며 최대값 비교 

3. 최댓값에 대한 시작 초를 시간 문자열로 변환

#include <string>
#include <vector>

#define MAXLEN 360000//99:59:59
using namespace std;

int video_time[MAXLEN];

string sec_to_time(int sec){//sec->시간(h:m:s) 
    string time="";
    
    int hour=sec/3600;
    sec%=3600;
    int min=sec/60;
    sec%=60;
    if(hour<10)
        time+="0";
    time+=to_string(hour)+":";
    if(min<10)
        time+="0";
    time+=to_string(min)+":";
    if(sec<10)
        time+="0";
    time+=to_string(sec);
    
    return time;
}
int time_to_sec(string time){//시간(h:m:s) -> sec
    int hour=stoi(time.substr(0,2));
    int min=stoi(time.substr(3,5));
    int sec=stoi(time.substr(6,8));
    sec+=hour*60*60+min*60;
    return sec;
}
string solution(string play_time, string adv_time, vector<string> logs) {
    string answer = "";
    
    //logs의 시작/끝 시간 변환, 구간 합 갱신
    for(int i=0;i<logs.size();i++){
        int start=time_to_sec(logs[i].substr(0,8));
        int end=time_to_sec(logs[i].substr(9,17));
        for(int j=start;j<end;j++){
            video_time[j]++;
        }
    }
    
    int adv_len=time_to_sec(adv_time);
    int video_len=time_to_sec(play_time);
    
    long long max_sum=0;
    long long sum=0;
    int Start_time=0;
    for(int i=0;i<adv_len;i++){//0~광고 길이 
        sum+=video_time[i];
    }
    max_sum=sum;
    
    //start_time~start_time+광고길이-1 대해 광고 시청수의 최댓값 비교
    for(int start_time=1; start_time<=(video_len-adv_len+1); start_time++){
        sum+=video_time[start_time+adv_len-1];
        sum-=video_time[start_time-1];
        if(sum>max_sum){
            sum=max_sum;
            Start_time=start_time;
        }
    }
    
    return sec_to_time(Start_time);
}

 

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

BOJ 1756 - 피자굽기(C++)  (0) 2021.08.26
BOJ 17142 - 연구소3(C++)  (0) 2021.08.25
BOJ 1405 - 미친로봇(C++)  (0) 2021.08.24
Programmers - 외벽점검(C++)  (0) 2021.08.20
BOJ 21608 - 상어초등학교(C++)  (0) 2021.08.19

댓글