CS/알고리즘_KAKAO BLIND RECRUITMENT

2021 KAKAO BLIND RECRUITMENT : 광고 삽입

Jedy_Kim 2021. 9. 27. 09:50
728x90

https://programmers.co.kr/learn/courses/30/lessons/72414?language=java 

 

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

시간을 나타내는 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
import java.util.*;
 
class Solution {
    public String solution(String play_time, String adv_time, String[] logs) {        
        
        int playSec = convert(play_time);
        int advSec  = convert(adv_time);
        
        int[] totalSec = new int[100*60*60];
        for(String log : logs) {
            int start = convert(log.substring(08));
            int end   = convert(log.substring(917));
            
            for(int i=start; i<end; i++) {
                totalSec[i] += 1;
            }            
        }
        
        long curSum = 0;
        for(int i=0; i<advSec; i++) {
            curSum += totalSec[i];
        }
        
        long maxSum = curSum;
        int maxIdx = 0;
        for(int i=advSec; i<playSec; i++) {
            curSum = curSum + totalSec[i] - totalSec[i - advSec];
            if(curSum > maxSum) {
                maxSum = curSum;
                maxIdx = i - advSec + 1;
            }
        }
        
        return String.format("%02d:%02d:%02d", maxIdx/3600, maxIdx/60%60, maxIdx%60);
    }
    
    public int convert(String str) {
        int[] parse = Arrays.stream(str.split(":")).mapToInt(Integer::parseInt).toArray();
        return parse[0]*60*60 + parse[1]*60 + parse[2];
    }
    
}
cs

// 복습

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
import java.util.*;
 
class Solution {
    public String solution(String play_time, String adv_time, String[] logs) {
        
        // 1.주어진 시간을 모두 초단위로 변환한다.
        int playSec = convert(play_time);
        int advSec  = convert(adv_time);
        
        // 문제 조건에서 "00:00:01 이상 99:59:59 이하" 라고 범위를 주었기 때문에 100시간으로 배열을 잡는다.
        int[] totalSec = new int[100*60*60];
        // 시청자들이 동영상을 재생한 구간의 위치를 +1 해준다.
        for(String log : logs) {  
            //"01:20:15-01:45:14"
            // start : 01:20:15            
            int start = convert(log.substring(08));
            // end : 01:45:14
            int end = convert(log.substring(917));
            // 재생 구간만다 +1
            for(int i=start; i<end; i++) {
                totalSec[i] += 1;   
            }            
        }
        
        // 구간별합의 최댓값을 구한다.
        // 예) 1 3 4 2 1 2 4
        // 구간 : 3
        // 첫 구간의합은 일일이 더해준다.
        // 1 + 3 + 4 = 8
        // 그 다음 구간 부터는 처음요소를 빼고 다음요소를 더해주면 효율성을 높이면서 구간의 합을 구해줄 수 있다.
        // 두 번째 구간의 합
        // 8 - 1(처음 요소) + 2(다음요소)
        long curSum = 0;
        for(int i=0; i<advSec; i++) {
            curSum += totalSec[i];
        }
        
        long maxSum = curSum;
        int maxIdx  = 0;
        for(int i=advSec; i<playSec; i++) {
            curSum = curSum - totalSec[i-advSec] + totalSec[i];
            // 구간의 합이 가장 큰 경우 값을 갱신해준다.
            if(curSum > maxSum) {
                maxSum = curSum; // 구간의 최대합
                maxIdx = i - advSec + 1// 최대구간의 시작 idx
            }
        }        
 
        return String.format("%02d:%02d:%02d", maxIdx/3600, maxIdx/60%60, maxIdx%60);
    }
    
    // 시분초 를 초단위로 변환해준다.
    public int convert(String str) {        
        int[] parse = Arrays.stream(str.split(":")).mapToInt(Integer::parseInt).toArray();
        return parse[0]*60*60 + parse[1]*60 + parse[2];        
    }
    
}
cs

 

반응형