사용한 것
- 누적 재생시간이 가장 많이 나오는 곳을 구하기 위한 누적 합
- 시간을 String <-> int로 변환하는
toIntTime()
, toStrTime()
풀이 방법
- "HH:MM:SS" (String) -> seconds (int)로 변환하여 풀이
logs
를 순회하며 times
를 채워줌
- 최대인 시간이 0초 일수도 있으므로 0 ~
advTime
- 1까지 for문 한번 돌려서 maxTotalTime에 넣어줌
- 나머지 구간에 대하여 누적 합을 계산하여
maxTotalTime
을 갱신해 줌
maxIdx
를 "HH:MM:SS"로 변환하여 반환
코드
import java.util.Arrays;
class Solution {
public String solution(String play_time, String adv_time, String[] logs) {
int playTime = toIntTime(play_time);
int advTime = toIntTime(adv_time);
int[] times = new int[360_000];
for (String log : logs) {
String[] splitLog = log.split("-");
int startTime = toIntTime(splitLog[0]);
int endTime = toIntTime(splitLog[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 maxTotalTime = totalTime;
for (int i = advTime; i < playTime; i++) {
totalTime += times[i] - times[i - advTime];
if (totalTime > maxTotalTime) {
maxTotalTime = totalTime;
maxIdx = i - advTime + 1;
}
}
return toStrTime(maxIdx);
}
int toIntTime(String strTime) {
int[] HMS = Arrays.stream(strTime.split(":"))
.mapToInt(Integer::parseInt)
.toArray();
return 3600 * HMS[0] + 60 * HMS[1] + HMS[2];
}
String toStrTime(int time) {
int H = time / 3600;
int M = (time - 3600 * H) / 60;
int S = time - 3600 * H - 60 * M;
return (H < 10 ? "0" : "") + H + ":" +
(M < 10 ? "0" : "") + M + ":" +
(S < 10 ? "0" : "") + S;
}
}