본문 바로가기

프로그래머스 퀴즈(Python)/level 3

23.03.29 파이썬 코딩 퀴즈#205 광고 삽입(프로그래머스 스쿨)

이번 문제는 광고 삽입 문제이다.

일단 위 설명에서는 건질 내용이 없으니 바로 다음 설명을 보자.

위 설명에 따르면 '죠르디'의 동영상의 총 재생시간은 2시간 3분 55초이며, 1,2,3,4,5로 표시된 검은 선은 각 시청자들이 '죠르디'의 동영상을 재생한 구간을 의미한다. 문제는 저 빨간선이다.

빨간선이 바로 광고의 삽입 위치를 나타내는데, 이때 광고의 누적 시청 시간이 가장 많은 구간을 찾아야 한다.

위 예시에서 광고 영상의 총 재생시간은 14분 15초 이다.

1번과 2번 시청자는 광고를 처음부터 끝까지 볼 수 있다. 하지만 5번 시청자의 경우 광고의 중간에 들어와서 광고의 끝까지 보게 된다. 이때 총 누적 시청 시간은 14분 15초(1번) + 14분 15초(2번) + 7분 30초(3번) 으로 총 36분이 된다.

 

초,분 계산이 복잡하기 때문에 이를 다시 초로만 환산하여 계산해 보자.

동영상의 시작은 언제나 0초이다. 그리고 예시의 영상은 총 7435초의 재생 시간을 가진다.

각 사용자의 시청기록을 초로 환산하면 위와 같고 이를 이용해 동영상을 시청한 시간을 구할 수 있다.

답은 이미 나왔기 때문에 광고 영상의 삽입 위치를 초로 환산해 보았다. 전체 길이는 855초 이고, 삽입된 위치는 5459 ~ 6314 초 사이이다. 

해당 문제는 구간(광고의 길이) 마다 누적 영상 재생 시간을 확인해야 한다. 이런 류의 문제에는 dp 가 딱이다.

먼저 전달받은 시간들을 초 단위로 환산하여 계산을 편하게 해줄 필요가 있다.

이때 전달되는 time 은 문자형으로 "00:00:00"의 형태로만 전달해야 한다.

코드 본문은 위와 같다.

먼저 광고 재생 시간과 영상 재생 시간이 같은 경우는 예외처리 해준다.

그 다음 dp 배열을 생성하고, 전달받은 logs에서 시작 시간과 끝나는 시간에만 값을 +1, -1 해준다.

그 다음 +1과 -1 사이에 빈 값을 채워주게 되는데, 이때에는 누적값을 채워줘야 한다.

위 표는 영상의 길이가 10이고, 총 3명의 시청자의 시청 기록을 정리한 내용이다.

2초에 영상을 시청하기 시작했다면, 3초가 되어야 시청 시간이 1초가 추가된다.

같은 반복문을 두번 실행하였는데,

첫번째 반복문은 각 구간의 현재 시청자 수를 의미하며, 두번째 반복문은 각 시간별 누적 영상 시청 시간이다.

그리고 최종적으로 만들어진 dp 를 탐색해야 하는데, 이때에는 광고의 재생시간에 영향을 받는다.

각 초를 기준으로 dp[end]값을 확인하여야 하며, dp[end]-dp[start]는 해당 시간대에 영상을 시청한 사람들의 평균 시청시간을 의미한다. 

이렇게 구해진 구간의 최대값을 갱신하여 해당 정수를 시간 타입으로 변환하여 반환하면 된다.