https://programmers.co.kr/learn/courses/30/lessons/72414
time_to_sec
: 00:00:00
로 표기된 시간을 초로 변환sec_to_time
: 초로 표기된 시간을 00:00:00
의 형태로 변환DP
를 활용하여 해결logs
의 값들을 통해 시작 시간, 끝나는 시간을 확인하고, 초기화 한 리스트 times
에 추가logs
의 내용을 처리한 후, times
의 값을 처음부터 읽으며 값을 누적시킴times
의 시간들을 읽어가며, 최대값이 나타나는 구간을 확인00:00:00
의 형태로 리턴# 시간을 초로 변환
def time_to_sec(time):
return int(time[:2])*3600 + int(time[3:5])*60 + int(time[6:])
# 초를 시간으로 변환
def sec_to_time(sec):
hour, sec = sec//3600, sec%3600
minute, sec = sec//60, sec%60
hour = str(hour).rjust(2, '0') # 일의 자리인 경우를 고려
minute = str(minute).rjust(2, '0')
sec = str(sec).rjust(2,'0')
return f'{hour}:{minute}:{sec}'
def solution(play_time, adv_time, logs):
# 플레이 시간, 광고 시간을 초로 변환
# 전체 플레이 시간 기준으로 dp 구현
play_sec = time_to_sec(play_time)
adv_sec = time_to_sec(adv_time)
times = [0 for _ in range(play_sec+1)]
# 시작점에 +1, 끝점에 -1 설정
for log in logs:
start, end = log[:8], log[9:]
times[time_to_sec(start)] += 1
times[time_to_sec(end)] -= 1
# 앞서 설정한 값들을 기준으로, 해당 시간대의 총 재생기록 표시
for idx in range(1, play_sec+1):
times[idx] += times[idx-1]
# 0초 기준으로 초기화
now = sum(times[:adv_sec]) # 현재 누적 재생 시간
result = now # 최대 누적 재생 시간
answer = 0 # 최적의 위치
for idx in range(1, play_sec+2-adv_sec) :
now += times[idx+adv_sec-1]-times[idx-1] # 맨 앞 값 제거, 맨 뒤 값 추가
if result < now : # 크기 비교
answer, result = idx, now
return sec_to_time(answer)
마지막의 최대 값을 구하는 과정에서, 처음에 sum
을 다수 활용했었는데, 시간 초과 이슈가 발생했었다. 이러한 문제를 해결하고자, 인덱스를 이동하며 sum
을 하는 과정을 앞의 값을 빼고, 뒤의 값을 더하는 방식으로 구현하였다. 전체적인 구조는 DP
를 활용하여 잘 해결할 수 있었다.