본문 바로가기

Algorithm

프로그래머스 광고 삽입 KAKAO BLIND 2021 ( 누적 합 ) JAVA

프로그래머스 광고 삽입  KAKAO BLIND 2021 ( 누적 합 ) JAVA


풀이

풀이를 생각해내는 게 쉽지 않았다.

결국에는 다른 사람의 풀이를 참고하고 누적합 문제라는 것을 인지할 수 있었다.

앞으로 비슷한 유형은 누적합으로 풀이를 시도해보면 좋을 것 같다.

 

 

programmers.co.kr/learn/courses/30/lessons/72414

 

코딩테스트 연습 - 광고 삽입

시간을 나타내는 HH, H1, H2의 범위는 00~99, 분을 나타내는 MM, M1, M2의 범위는 00~59, 초를 나타내는 SS, S1, S2의 범위는 00~59까지 사용됩니다. 잘못된 시각은 입력으로 주어지지 않습니다. (예: 04:60:24, 11

programmers.co.kr

소스 코드


package kakao.blind2021;

import java.util.ArrayList;
import java.util.List;

public class Problem5 {
    public static void main(String[] args) {
        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"};
        String res = solution(play_time, adv_time, logs);
        System.out.println(res);


    }

    static List<Log> li = new ArrayList<>();
    static long[] totalTime;

    public static String solution(String play_time, String adv_time, String[] logs) {
        String answer = "";

        int playTime = retTime(play_time);
        int advTime = retTime(adv_time);
        totalTime = new long[playTime + 1];
        for (int i = 0; i < logs.length; i++) {
            String[] sArr = logs[i].split("-");
            li.add(new Log(retTime(sArr[0]), retTime(sArr[1])));
        }
        for (int i = 0; i < li.size(); i++) {
            totalTime[li.get(i).start]++;
            totalTime[li.get(i).end]--;
        }
        for (int i = 1; i < totalTime.length; i++) {
            totalTime[i] = totalTime[i - 1] + totalTime[i];
        }
        for (int i = 1; i < totalTime.length; i++) {
            totalTime[i] = totalTime[i - 1] + totalTime[i];
        }

        long res = totalTime[advTime - 1];
        int idx = 0;
        for (int i = 0; i < playTime - advTime; i++) {
            if (totalTime[i + advTime] - totalTime[i] > res) {
                res = totalTime[i + advTime] - totalTime[i];
                idx = i + 1;
            }
        }
        answer = retStringTime(idx);
        return answer;
    }

    public static int retTime(String s) {
        int res = 0;
        String[] sArr = s.split(":");
        res += Integer.parseInt(sArr[0]) * 3600;
        res += Integer.parseInt(sArr[1]) * 60;
        res += Integer.parseInt(sArr[2]);

        return res;


    }

    public static String retStringTime(int t) {
        int h = t / 3600;
        int m = (t - 3600 * h) / 60;
        int s = t - 3600 * h - 60 * m;
        return String.format("%02d:%02d:%02d", h, m, s);
    }


    public static class Log {
        int start;
        int end;

        public Log(int start, int end) {
            this.start = start;
            this.end = end;
        }

    }
}