반응형
문제
카카오TV에서 유명한 크리에이터로 활동 중인 죠르디는 환경 단체로부터 자신의 가장 인기있는 동영상에 지구온난화의 심각성을 알리기 위한 공익광고를 넣어 달라는 요청을 받았습니다. 평소에 환경 문제에 관심을 가지고 있던 "죠르디"는 요청을 받아들였고 광고효과를 높이기 위해 시청자들이 가장 많이 보는 구간에 공익광고를 넣으려고 합니다. "죠르디"는 시청자들이 해당 동영상의 어떤 구간을 재생했는 지 알 수 있는 재생구간 기록을 구했고, 해당 기록을 바탕으로 공익광고가 삽입될 최적의 위치를 고를 수 있었습니다.
참고로 광고는 재생 중인 동영상의 오른쪽 아래에서 원래 영상과 동시에 재생되는 PIP(Picture in Picture) 형태로 제공됩니다.
풀이 방법
1. 시간을 초로 변환해준다
2. 누적 재생시간이 가장 많이 나오는 구간을 구하기 위해 누적합을 구해준다.
3. 슬라이딩 윈도우를 통해 최대의 시간을 구해준다.
코드
class Solution {
public String solution(String play_time, String adv_time, String[] logs) {
String answer = "";
int playTime = timeToSecond(play_time);
int advTime = timeToSecond(adv_time);
int[] times = new int[360000];
if(play_time.equals(adv_time)) return "00:00:00";
for(String log : logs) {
String[] splitTime = log.split("-");
int startTime = timeToSecond(splitTime[0]);
int endTime = timeToSecond(splitTime[1]);
for(int i = startTime; i < endTime; i++) {
times[i]++;
}
}
int maxIdx = 0;
long totalTime = 0;
for(int i = 0; i < advTime; i++) {
totalTime += times[i];
}
long maxTime = totalTime;
for(int i = advTime; i < playTime; i++) {
totalTime += times[i] - times[i - advTime];
if(totalTime > maxTime) {
maxTime = totalTime;
maxIdx = i - advTime + 1;
}
}
return secondToTime(maxIdx);
}
public int timeToSecond(String time) {
String[] s = time.split(":");
return (3600 * Integer.parseInt(s[0]) + Integer.parseInt(s[1]) * 60 + Integer.parseInt(s[2]));
}
public String secondToTime(int time) {
int hour = time / 3600;
time %= 3600;
int minute = time / 60;
time %= 60;
int second = time;
return (hour < 10 ? "0" : "") + hour + ":" +
(minute < 10 ? "0" : "") + minute + ":" +
(second < 10 ? "0" : "") + second;
}
}
반응형
'알고리즘 > 프로그래머스 LV3' 카테고리의 다른 글
[프로그래머스] LV3 가장 먼 노드(JAVA) (0) | 2024.04.16 |
---|---|
[프로그래머스] LV3 기지국 설치[JAVA] (0) | 2024.04.08 |
[프로그래머스] LV3 단속카메라(JAVA) (0) | 2024.04.08 |
[프로그래머스] LV3 단어 변환(JAVA DFS 풀이) (0) | 2024.04.02 |
[프로그래머스] LV3 야근 지수(JAVA) (0) | 2024.04.02 |