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

dongEon·2023년 3월 21일
0

문제링크: https://school.programmers.co.kr/learn/courses/30/lessons/72414

문제 설명

카카오TV에서 유명한 크리에이터로 활동 중인 죠르디는 환경 단체로부터 자신의 가장 인기있는 동영상에 지구온난화의 심각성을 알리기 위한 공익광고를 넣어 달라는 요청을 받았습니다. 평소에 환경 문제에 관심을 가지고 있던 "죠르디"는 요청을 받아들였고 광고효과를 높이기 위해 시청자들이 가장 많이 보는 구간에 공익광고를 넣으려고 합니다. "죠르디"는 시청자들이 해당 동영상의 어떤 구간을 재생했는 지 알 수 있는 재생구간 기록을 구했고, 해당 기록을 바탕으로 공익광고가 삽입될 최적의 위치를 고를 수 있었습니다.
참고로 광고는 재생 중인 동영상의 오른쪽 아래에서 원래 영상과 동시에 재생되는 PIP(Picture in Picture) 형태로 제공됩니다.

문제

"죠르디"의 동영상 재생시간 길이 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자리 문자열로 반환합니다.

풀이

def str_to_int(t): # 1
    h,m,s = t.split(':')
    return int(h) * 3600 + int(m) * 60 + int(s)

def int_to_str(t):
    return str(t // 3600).zfill(2) + ':' + str((t % 3600)//60).zfill(2) + ':' + str(t%60).zfill(2)

def solution(play_time, adv_time, logs):
    p_t = str_to_int(play_time)
    adv_t = str_to_int(adv_time)    
    times = [0] * (p_t + 1)
    
    for i in logs: #2
        start, end = i.split('-')
        start = str_to_int(start)
        end = str_to_int(end)
        
        times[start] += 1
        times[end] -= 1
    
    for i in range(1, len(times)):#3
        times[i] = times[i] + times[i-1]
    
    for i in range(1, len(times)):#4
        times[i] = times[i] + times[i-1]
    _max = 0    
    maxtime = 0
    for i in range(adv_t -1, p_t):#5
        if i >= adv_t:
            if times[i] - times[i - adv_t] > _max:
                maxtime = i - adv_t + 1
                _max = times[i] - times[i - adv_t]
        else:
            if times[i] > _max:
                maxtime = i - adv_t + 1
                _max = times[i]
    
    return int_to_str(maxtime)
        

풀이 방법:

  1. 초단위로 시간을 환산.
  2. start, end에 각각 +1 과 - 1을 하여 언제 시청자들이 들어오고 빠져나가는지 기록.
  3. times 배열을 한번 순회 함으로써 각 시간대의 시청자수를 계산.
  4. times 배열을 한번 더 순회 함으로써 각 시간대의 누적 시청자수를 계산.
  5. times[3] - times[2] = 2초 부터 3초 까지의 시청자수 이므로 for 문을 통해 광고 시간동안 가장 많은 시청자수를 가진 시간대를 maxtime에 저장한다.
profile
개발하면서 생긴 이슈와 알게된 점, 알고리즘 등을 기록하는 블로그입니다.

0개의 댓글