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 |
댓글