📍 문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/72414
💡 접근
시청자가 듣는 시간에 광고를 삽입해서 새로운 시청자가 등장하는 경우, 시청자가 시청을 끝낸 경우, 광고 시간이 끝나는 경우 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);
}
}
'Algorithm > programmers' 카테고리의 다른 글
[2019 카카오 인턴십]징검다리 건너기 (0) | 2022.07.15 |
---|---|
[2019 카카오 블라인드]매칭 점수 (0) | 2022.07.15 |
[2020 카카오 인턴십]경주로 건설 (0) | 2022.07.14 |
[2019 카카오 인턴십]불량 사용자★ (0) | 2022.07.14 |
[2020 카카오 인턴십]보석 쇼핑 (0) | 2022.07.14 |