https://school.programmers.co.kr/learn/courses/30/lessons/72414
문제가 어려우다~~... 찾아보고 풀었다..
모든 시간을 초단위로 변경한다
전체재생시간배열 만들고
시청자의 시작시간 인덱스 ++
마치는 시간 --
전제재생시간배열 순회하면서 누적하면 초단위로 시청자수가 나온다
슬라이딩 윈도우의 왼쪽은 0 이고 오른쪽은 공익광고 시간 세팅하고 하나씩 증가하면서
공익광고 시간안에 시청자수 최대를 찾는다
import java.util.*;
class Solution {
public String solution(String play_time, String adv_time, String[] logs) {
int totaltime = toSecond(play_time);
int advsecond = toSecond(adv_time);
int[] viewcnt = new int[totaltime + 1];
for (String log : logs) {
String[] times = log.split("-");
int start = toSecond(times[0]);
int end = toSecond(times[1]);
viewcnt[start]++;
viewcnt[end]--;
}
for (int i = 1; i <= totaltime; i++) {
viewcnt[i] += viewcnt[i - 1];
}
long currentSum = 0;
for (int i = 0; i < advsecond; i++) {
currentSum += viewcnt[i];
}
long maxSum = currentSum;
int maxTime = 0;
for (int start = 0; start + advsecond < totaltime; start++) {
currentSum = currentSum - viewcnt[start] + viewcnt[start + advsecond];
if (currentSum > maxSum) {
maxSum = currentSum;
maxTime = start + 1;
}
}
return toTimeString(maxTime);
}
public int toSecond(String time) {
String[] parts = time.split(":");
int h = Integer.parseInt(parts[0]);
int m = Integer.parseInt(parts[1]);
int s = Integer.parseInt(parts[2]);
return h * 3600 + m * 60 + s;
}
public String toTimeString(int seconds) {
int h = seconds / 3600;
int m = (seconds % 3600) / 60;
int s = seconds % 60;
return String.format("%02d:%02d:%02d", h, m, s);
}
}
감사합니다. 이런 정보를 나눠주셔서 좋아요.