[Py]카카오 - 광고 삽입

Imomo·2021년 4월 15일
0

코테 - 파이썬

목록 보기
3/9

카카오 2021 문제

“죠르디”의 동영상 재생시간 길이 play_time, 공익광고의 재생시간 길이 adv_time, 시청자들이 해당 동영상을 재생했던 구간 정보 logs가 매개변수로 주어질 때, 시청자들의 누적 재생시간이 가장 많이 나오는 곳에 공익광고를 삽입하려고 합니다. 이때, 공익광고가 들어갈 시작 시각을 구해서 return 하도록 solution 함수를 완성해 주세요. 만약, 시청자들의 누적 재생시간이 가장 많은 곳이 여러 곳이라면, 그중에서 가장 빠른 시작 시각을 return 하도록 합니다.

풀이

  • 시간 문자열
  • 메모리제이션
  • DP알고리즘
  • 반복문을 통해 누적 시청자수를 차곡차곡 기록하고, 그걸 나중에 빼서 계산을 진행

1 . 모든 시간을 '초'단위로 환산
2. logs 내의 모든 시간 초로 환산 및 start, end 구분
3. 구간별 시청자수 기록
4. 모든 구간 시청자 누적 기록
5. 누적된 시청자수를 바탕으로 가장 시청자수가 많은 구간 탐색

  • max_time 값이 마지막으로 업데이트될 때의 시각 i - at + 1을 HH:MM:SS 형태로 변환한 값이 문제에서 요구하는 정답

코드

def solution(play_time, adv_time, logs):
    answer = ''
    play_time_sec = str_to_int(play_time)        # 1
    adv_time_sec  = str_to_int(adv_time)
    total_time = [0 for i in range(play_time_sec + 1)]
    #total_time[x] = x 시각에 시작된 재생 구간의 개수 – x 시각에 종료된 재생구간의 개수
    for x in logs:
        logs_start_sec,logs_end_sec = x.split("-")
        logs_start_sec = str_to_int(logs_start_sec)
        logs_end_sec   = str_to_int(logs_end_sec)
        total_time[logs_start_sec] += 1
        total_time[logs_end_sec]   -= 1
    for i in range(1, (play_time_sec)):   # 3 
        total_time[i] = total_time[i] + total_time[i - 1]
    for i in range(1, (play_time_sec)):   # 4
        total_time[i] = total_time[i] + total_time[i - 1]
    most_view = 0
    max_time = 0
    for i in range(adv_time_sec - 1, play_time_sec):
        if i >= adv_time_sec: 
            if most_view < total_time[i] - total_time[i - adv_time_sec]:
                most_view = total_time[i] - total_time[i - adv_time_sec]
                max_time = i - adv_time_sec + 1
        else:
             if most_view < total_time[i]:
                most_view = total_time[i]
                max_time = i - adv_time_sec + 1
    #most_view = int_to_str(most_view)
    #max_time = int_to_str(max_time)
    #print(max_time , most_view)
    #answer = max_time
    return int_to_str(max_time)
def str_to_int(time):
    h, m, s = time.split(':')
    return int(h) * 3600 + int(m) * 60 + int(s)
def int_to_str(time):
    h = time // 3600
    h = '0' + str(h) if h < 10 else str(h)
    time = time % 3600
    m = time // 60
    m = '0' + str(m) if m < 10 else str(m)
    time = time % 60
    s = '0' + str(time) if time < 10 else str(time)
    return h + ':' + m + ':' + s

졸라어렵네...

풀이 출처 : https://dev-note-97.tistory.com/156

0개의 댓글