본문 바로가기
Algorithm

[프로그래머스] 광고 삽입 (Python, 2021 카카오 blind recruitment)

by 파이현 2025. 10. 9.

☁️ 문제 설명

  • 시청자들이 가장 많이 보는 구간에 공익광고 넣기
  • 시청자들이 해당 동영상의 어떤 구간을 재생했는지 알 수 있는 재생구간 기록을 구했고, 해당 기록으로 공익광고가 삽입될 최적의 위치를 고름
  • 파란색: 동영상의 전체
  • 검정색: 재생 기록을 구분하는 id
  • 빨간색: 최적의 공익광고 위치 -> 이 구간을 시청한 시청자들의 누적 재생 시간이 가장 크기 때문

 

☁️ 입출력

  • 입력
    • `play_time`: 동영상 총 재생 시간 길이 ("02:03:55")
    • `adv_time`: 공익광고의 재생시간 길이 ("00:14:15")
    • `logs`: 시청자들의 해당 동영상을 재생했던 구간 정보(["01:20:15-01:45:14", "00:40:31-01:00:00"])
  • 출력
    • 공익광고가 들어갈 시작 시각 (여러 곳이면 가장 빠른 시각) ("01:30:59")

 


💡 풀이 아이디어

  • 1. play_time, adv_time을 second로 변환
  • 2. 차분 배열
  • 3. 구간합: t초의 동시 시청자 수
  • 4. 구간합: 누적 시청 시간
  • 5. 슬라이딩 윈도우

 

💻 코드

def to_sec(hms):
    h, m, s = map(int, hms.split(':'))
    return h*3600 + m*60 +s

def to_hms(sec):
    h = sec // 3600
    sec %= 3600
    m = sec // 60
    s = sec % 60
    return f'{h:02d}:{m:02d}:{s:02d}'

def solution(play_time, adv_time, logs):
    p = to_sec(play_time)
    a = to_sec(adv_time)
    
    if a >= p:
        return '00:00:00'
    
    # 차분 배열
    diff = [0] * (p+2)
    
    for log in logs:
        s_str, e_str = log.split('-')
        s = to_sec(s_str)
        e = to_sec(e_str)
        diff[s] += 1
        diff[e] -= 1
    
    # 누적합: t초의 동시 시청자 수
    viewers = [0] * (p+1)
    cur = 0
    for t in range(p):
        cur += diff[t]
        viewers[t] = cur
        
    # 누적합: 누적 시청 시간
    sum = [0] * (p+1)
    for t in range(1, p+1):
        sum[t] = sum[t-1] + viewers[t-1]
    
    # 슬라이딩 윈도우
    best_start = 0
    best_sum = sum[a] - sum[0]
    
    for i in range(1, p-a+1):
        total = sum[i+a] - sum[i]
        if total > best_sum:
            best_sum = total
            best_start = i
    
    return to_hms(best_start)