220311 - 광고 삽입
◾ 광고 삽입 : 프로그래머스 LEVEL 3
문제
"죠르디"의 동영상 재생시간 길이 play_time, 공익광고의 재생시간 길이 adv_time, 시청자들이 해당 동영상을 재생했던 구간 정보 logs가 매개변수로 주어질 때, 시청자들의 누적 재생시간이 가장 많이 나오는 곳에 공익광고를 삽입하려고 합니다. 이때, 공익광고가 들어갈 시작 시각
을 구해서 return 하도록 solution 함수를 완성해주세요. 만약, 시청자들의 누적 재생시간이 가장 많은 곳이 여러 곳이라면, 그 중에서 가장 빠른 시작 시각
을 return 하도록 합니다.
입력
- play_time, adv_time은 길이 8로 고정된 문자열입니다.
- play_time, adv_time은 HH:MM:SS 형식이며, 00:00:01 이상 99:59:59 이하입니다.
- 즉, 동영상 재생시간과 공익광고 재생시간은 00시간 00분 01초 이상 99시간 59분 59초 이하입니다.
- 공익광고 재생시간은 동영상 재생시간보다 짧거나 같게 주어집니다.
- logs는 크기가 1 이상 300,000 이하인 문자열 배열입니다.
- logs 배열의 각 원소는 시청자의 재생 구간을 나타냅니다.
- logs 배열의 각 원소는 길이가 17로 고정된 문자열입니다.
- logs 배열의 각 원소는 H1:M1:S1-H2:M2:S2 형식입니다.
- H1:M1:S1은 동영상이 시작된 시각, H2:M2:S2는 동영상이 종료된 시각을 나타냅니다.
- H1:M1:S1는 H2:M2:S2보다 1초 이상 이전 시각으로 주어집니다.
- H1:M1:S1와 H2:M2:S2는 play_time 이내의 시각입니다.
- 시간을 나타내는 HH, H1, H2의 범위는 00~99, 분을 나타내는 MM, M1, M2의 범위는 00~59, 초를 나타내는 SS, S1, S2의 범위는 00~59까지 사용됩니다. 잘못된 시각은 입력으로 주어지지 않습니다. (예: 04:60:24, 11:12:78, 123:12:45 등)
- return 값의 형식
- 공익광고를 삽입할 시각을 HH:MM:SS 형식의 8자리 문자열로 반환합니다.
출력
- 공익광고가 들어갈 시작 시각
입출력 예
play_time | adv_time | logs | result |
---|---|---|---|
"02:03:55" | "00:14:15" | ["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"] | "01:30:59" |
"99:59:59" | "25:00:00" | ["69:59:59-89:59:59", "01:00:00-21:00:00", "79:59:59-99:59:59", "11:00:00-31:00:00"] | "01:00:00" |
"50:00:00" | "50:00:00" | ["15:36:51-38:21:49", "10:14:18-15:36:51", "38:21:49-42:51:45"] | "00:00:00" |
◾ 풀이
1. 해설
- 누적합을 통해 전체 시청자를 구하여 각 구간의 시청자를 비교하여 가장 많은 시청자가 모인 구간을 찾는다.
- 누적합을 통해 구간별 시청자 수를 구한다.
- 누적합을 한번 더 진행하여 전체 시청자 수를 구한다.
- 광고 시간 만큼의 구간에서 시청자 수를 비교하여 최대값을 찾는다.
- 시간이 HH:MM:SS 형태로 되어있기 때문에 비교하기 쉽게 초로 바꾸어 사용한다.
2. 프로그램
- play_time, adv_time을 초로 변경
- logs의 시간을 초로 변경하여 구간별 입력
- 누적합을 통해 각 시간별 시청자 수 확인
- 누적합을 통해 각 시간별 누적 시청자 수 확인
- 광고 시간 범위의 구간에서 가장 많은 시청자를 가진 구간 확인
- i : 끝 시간, adv_time : 광고 시간
- 시청자 수 : play_count[i] - play_count[i - adv_time]
- 시간을 초로 표현하였기 때문에
HH:MM:SS
형태로 변경하여 반환
# 코드
def solution(play_time, adv_time, logs):
answer = ''
# 각 시간 초 형태로 변경
h, m, s = play_time.split(':')
play_time = int(h) * (60 ** 2) + int(m) * (60) + int(s)
# 각 시간 초 형태로 변경
h, m, s = adv_time.split(':')
adv_time = int(h) * (60 ** 2) + int(m) * (60) + int(s)
if play_time == adv_time:
return '00:00:00'
# logs의 시간에 따라 구간별 입력
play_count = [0] * (play_time+1)
for time in logs:
start_time, end_time = time.split('-')
s_time = 0
e_time = 0
h, m, s = start_time.split(':')
s_time += int(h) * (60 ** 2) + int(m) * (60) + int(s)
h, m, s = end_time.split(':')
e_time += int(h) * (60 ** 2) + int(m) * (60) + int(s)
play_count[s_time] += 1
play_count[e_time] -= 1
# 누적합을 통해 각 시간별 시청자 계산
for i in range(1, play_time):
play_count[i] = play_count[i] + play_count[i-1]
# 누적합을 통해 각 시간별 누적 시청자 계산
for i in range(1, play_time):
play_count[i] = play_count[i] + play_count[i-1]
# 시청자가 가장 많은 범위 확인
most_view = 0
max_time = 0
for i in range(adv_time - 1, play_time+1):
if most_view < play_count[i] - play_count[i - adv_time]:
most_view = play_count[i] - play_count[i - adv_time]
max_time = i - adv_time + 1
# 시간을 'HH:MM:SS' 형태로 변경
h = max_time // 3600
h = '0' + str(h) if h < 10 else str(h)
max_time = max_time % 3600
m = max_time // 60
m = '0' + str(m) if m < 10 else str(m)
s = max_time % 60
s = '0' + str(s) if s < 10 else str(s)
answer = h + ':' + m + ':' + s
return answer
Author And Source
이 문제에 관하여(220311 - 광고 삽입), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@skarb4788/220311-광고-삽입저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)