https://programmers.co.kr/learn/courses/30/lessons/72414
코딩테스트 연습 - 광고 삽입
시간을 나타내는 HH, H1, H2의 범위는 00~99, 분을 나타내는 MM, M1, M2의 범위는 00~59, 초를 나타내는 SS, S1, S2의 범위는 00~59까지 사용됩니다. 잘못된 시각은 입력으로 주어지지 않습니다. (예: 04:60:24, 11
programmers.co.kr
풀이 과정 아이디어
- H:M:S을 초단위로 변경
- DP 사용(초 단위의 list를 저장)
log의 시작 시간과 끝나는 시간을+1/-1을 대입- 끝나는 시간에는 시청자가 빠져나가기 때문에
-1을 대입 - 이후 이전의 정보를 저장해줌으로써 해당 시간에 시청자 수 확인 가능
- 끝나는 시간에는 시청자가 빠져나가기 때문에
- 해당 시간 별 누적 시청자를 계산하기 위해 위의 과정 반복
- 광고 시간부터 플레이 타임 까지 계산(광고 시간만큼만 계산되는 경우도 고려)
def second_to_time(second) :
h = str(second // 3600)
if len(h) == 1 :
h = '0' + h
second = second % 3600
m = str(second // 60)
if len(m) == 1 :
m = '0' + m
second = second % 60
s = str(second)
if len(s) == 1 :
s = '0' + s
return h + ':' + m + ':' + s
def time_to_second(time) :
h, m, s = map(int, time.split(':'))
return 3600 * h + 60 * m + s
def solution(play_time, adv_time, logs):
play_time = time_to_second(play_time)
adv_time = time_to_second(adv_time)
dp = [0] * (play_time + 1)
dp_accumulate = [0] * (play_time + 1)
for i in logs :
start, end = i.split('-')
start = time_to_second(start)
end = time_to_second(end)
dp[start] += 1
dp[end] -= 1
for j in range(1, play_time + 1) :
dp[j] = dp[j] + dp[j-1]
dp_accumulate[j] = dp[j] + dp_accumulate[j-1]
max_time = 0
most_view = 0
for l in range(adv_time - 1, play_time + 1) :
if l < adv_time :
most_view = dp_accumulate[l]
max_time = l - adv_time + 1
else :
if most_view < dp_accumulate[l] - dp_accumulate[l - adv_time] :
most_view = dp_accumulate[l] - dp_accumulate[l - adv_time]
max_time = l - adv_time + 1
return second_to_time(max_time)
'코딩 > 코테대비' 카테고리의 다른 글
| [Baekjoon] 1520번 내리막 길 / Python (0) | 2022.01.25 |
|---|---|
| [Baekjoon] 7569번 토마토 / Python (0) | 2022.01.18 |
| [Baekjoon] 15686번 치킨배달 / Python (0) | 2022.01.11 |