티스토리 뷰

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

 

  1. 10초짜리 동영상을 0초부터 봤다는 것은 10초에 동영상 끝난 것이다. 따라서 0초부터 9초 까지만 시청자 누적 수를 더해주어야 한다.
  2. 누적 합이 정수 범위를 넘어갈 수 있어 long으로 선언해야 한다.
  3. 큐로 투포인터를 실행한다.

코드 참조 : https://yjyoon-dev.github.io/kakao/2021/01/29/kakao-insertad/

 

import java.util.*;
// 210515

class Solution_LV3_광고삽입 {
	// 문자열 시간 -> 초
	static int strToSec(String time) {
		String[] arr = time.split(":");
		int sec = stoi(arr[0])*60*60 + stoi(arr[1])*60 + stoi(arr[2]);
		return sec;
	}
	
	// 초 -> 문자열 시간
	static String secToStr(int sec) {
		String str="";
		
		int m = sec/60; int s = sec%60;
		int h = m/60; m = m%60;
		
		if(h<10) str += ("0" + h + ":");
		else str+= (h + ":");
		
		if(m<10) str += ("0" + m + ":");
		else str+= (m + ":");
		
		if(s<10) str += ("0" + s);
		else str+= s;
		
		return str;
	}
	
    public String solution(String play_time, String adv_time, String[] logs) {
        int[] watchers = new int[100*60*60];
        
        // 1. 누적 시청자 수 
        for(String log: logs) {
        	String[] t = log.split("-");
        	int startTime = strToSec(t[0]);
        	int endTime = strToSec(t[1]);
        	for(int s=startTime; s<endTime; s++) {
        		++watchers[s];
        	}
        }
        
        // 전체 동영상 재생 시간 (초)
        int totalLen = strToSec(play_time);
        // 광고 동영생 재생 시간 (초)
        int adLen = strToSec(adv_time);
        
        Queue<Integer> q = new ArrayDeque<Integer>();
        long sum = 0; // 현재 구간 합 (누적 시청자 수)
        long maxSum = 0; // 최대 구간 합 (누적 시청자 수)
        // 2. 0초~adLen초 까지의 구간합
        for(int i=0; i<adLen; i++) {
        	sum += watchers[i];
        	q.offer(watchers[i]);
        }
        maxSum = sum;
        int idx = 0;
        
        for(int i=adLen; i<totalLen; i++) {
        	// i초 구간에서의 시청자 수
        	sum += watchers[i];
        	q.offer(watchers[i]);
        	
        	// 큐의 맨 앞 시청자 수 - 구간 제외
        	sum -= q.poll();
        	
        	if(sum > maxSum) {
        		maxSum = sum;
        		idx = i-adLen+1;
        	}
        }

        return secToStr(idx);
    }
    
    static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함