[프로그래머스 / Level3] 광고 삽입 (Java)

wannabeking·2022년 6월 24일
0

코딩테스트

목록 보기
21/155

문제 보기



사용한 것

  • 누적 재생시간이 가장 많이 나오는 곳을 구하기 위한 누적 합
  • 시간을 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;
    }
}


profile
내일은 개발왕 😎

0개의 댓글