Algorithm/programmers

[2021 카카오 블라인드]광고 삽입

마닐라 2022. 7. 15. 10:51

📍 문제 설명

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

💡 접근

시청자가 듣는 시간에 광고를 삽입해서 새로운 시청자가 등장하는 경우, 시청자가 시청을 끝낸 경우, 광고 시간이 끝나는 경우 3가지로 나누어서 생각해보려 했다.

 

시청자의 시청 시작 시간이 35:50-46:30, 43:50-55:11, 49:55-59:15,이고 광고 시간이 10:00 이라면 45:50, 53:50, 59:55이런식으로..

 

1.35분 50초에 광고 삽입했을 때 45:50분에 광고가 끝난다.

43:50에 새로운 시청자 등장.

시청자 수 1명이고 시간 계산 8:51 x 1

45:50에 광고 끝

시청자 수 2명이고 시간 계산 2 x 2

8:51 + 4 = 12:51분 -> 누적 재생시간

 

2.43분 50초에 광고 삽입했을 때 53:50분에 광고가 끝난다.

->이 때 첫번째 시청자도 고려해줘야 하는 부분도 있어서 시간초과가 났다.

 

그래서 풀이 영상을 참고했다.

~99:59:59 까지 나올 수 있는 동영상 재생 시간은 360000이다.

따라서 각 사용자마다 배열에 누적으로 값을 넣어줄 수 있다.

그리고나서 광고시간만큼의 누적합을 더해가서 최대 시청시간인 부분을 구할 수 있다.

 

👩‍💻 코드

import java.beans.Visibility;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

class Main {
    public String solution(String play_time, String adv_time, String[] logs) {
        String answer = "";

        int playSec = convert(play_time);
        int advSec = convert(adv_time);

        int[] totalSec = new int[100 * 3600];

        for(String log : logs) {
            int start = convert(log.substring(0, 8));
            int end = convert(log.substring(9, 17));
            for(int i = start; i < end; i++) {
                totalSec[i] += 1;
            }
        }

        long currSum = 0;
        for(int i = 0; i < advSec; i++) {
            currSum += totalSec[i];
        }

        long maxSum = currSum;
        int maxIdx = 0;
        for(int i = advSec; i < playSec; i++) {
            currSum += totalSec[i] - totalSec[i - advSec];
            if(currSum > maxSum) {
                maxSum = currSum;
                maxIdx = i - advSec + 1;
            }
        }

        return String.format("%02d:%02d:%02d", maxIdx/3600, maxIdx/60%60, maxIdx%60);
    }

    public int convert(String time) {
        String[] nums = time.split(":");

        return Integer.parseInt(nums[0]) * 60 * 60 +
                Integer.parseInt(nums[1]) * 60 +
                Integer.parseInt(nums[2]);
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Main main = new Main();

        String play_time = "02:03:55";
        String adv_time = "00:14:15";
        String[] logs = {"01:20:15-01:45:14", "00:40:31-01:00:00", "00:25:50-00:48:29", "01:30:59-01:53:29", "01:37:44-02:02:30"};

        main.solution(play_time, adv_time, logs);
    }
}