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(0, 8));
int end = convert(log.substring(9, 17));
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(0, 8));
// end : 01:45:14
int end = convert(log.substring(9, 17));
// 재생 구간만다 +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 |
반응형
'CS > 알고리즘_KAKAO BLIND RECRUITMENT' 카테고리의 다른 글
2019 KAKAO BLIND RECRUITMENT : 길 찾기 게임 (0) | 2021.09.29 |
---|---|
2020 KAKAO BLIND RECRUITMENT : 기둥과 보 설치 (0) | 2021.09.28 |
2018 KAKAO BLIND RECRUITMENT : [1차] 비밀지도 (0) | 2021.06.27 |
로또의 최고 순위와 최저 순위 (0) | 2021.06.27 |
[카카오 인턴] 키패드 누르기 (0) | 2021.06.27 |