프로그래밍 공방

[프로그래머스] 광고 삽입 본문

개발/문제해결

[프로그래머스] 광고 삽입

hyosupsong 2021. 1. 27. 18:56

문제

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

문제해결방법

이 문제는 전체 시간을 배열로 잡고 각 시간마다 몇 명이 듣고 있는지 다 구해준 다음에 광고 길이를 구간으로 잡고

그 구간의 합이 최대가 될 때의 시작 시간을 반환하는 문제였다.

* 계속 테스트 케이스 하나가 틀렸는데 알고보니까 자료형 문제였다. 정신차리고 주의하자.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package Programmers;
 
public class Solution_광고삽입 {
 
    public static int[] timeLine, sumOfTimeLine;
    
    public static int timeToInt(String time) {
        String[] str = time.split(":");
        return Integer.parseInt(str[0])*3600+Integer.parseInt(str[1])*60+Integer.parseInt(str[2]);
    }
    
    public static String intToTime(long time) {
        StringBuilder sb = new StringBuilder();
        if(time/3600<10) sb.append('0');
        sb.append(time/3600);
        sb.append(':');
        time%=3600;
        if(time/60<10) sb.append('0');
        sb.append(time/60);
        sb.append(':');
        time%=60;
        if(time<10) sb.append('0');
        sb.append(time);
        return sb.toString();
    }
    
    public static String solution(String play_time, String adv_time, String[] logs) {
        String answer = "";
        timeLine = new int[timeToInt(play_time)+1];
        sumOfTimeLine = new int[timeToInt(play_time)+1];
        int adv = timeToInt(adv_time);
        for(int i=0; i<logs.length; i++) {
            String[] str = logs[i].split("-");
            timeLine[timeToInt(str[0])]++;
            timeLine[timeToInt(str[1])]--;
        }
        int curViewCount = 0;
        long sum = 0;
        for(int i=0; i<=adv; i++) {
            sum += curViewCount;
            curViewCount+=timeLine[i];
            sumOfTimeLine[i] = curViewCount;
        }
        long max = sum;
        int startTime = 0;
        for(int i = adv+1; i<timeLine.length; i++) {
            sum += curViewCount;
            sum -= sumOfTimeLine[i-adv-1];
            curViewCount+=timeLine[i];
            sumOfTimeLine[i] = curViewCount;
            if(max<sum) {
                max = sum;
                startTime = i-adv;
            }
        }
        answer = intToTime(startTime);
        System.out.println(intToTime(max));
        return answer;
    }
    
    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"};
        System.out.println(solution(play_time, adv_time, logs));
    }
}
cs


코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.