공부하고 기록하는, 경제학과 출신 개발자의 노트

프로그래밍/코딩테스트 문제풀이

[Python] 프로그래머스. 2021 카카오 recruit - 광고 삽입 (Level 3)

inspirit941 2021. 2. 22. 08:28
반응형

programmers.co.kr/learn/courses/30/lessons/72414#fn1

 

코딩테스트 연습 - 광고 삽입

시간을 나타내는 HH, H1, H2의 범위는 00~99, 분을 나타내는 MM, M1, M2의 범위는 00~59, 초를 나타내는 SS, S1, S2의 범위는 00~59까지 사용됩니다. 잘못된 시각은 입력으로 주어지지 않습니다. (예: 04:60:24, 11

programmers.co.kr

 

누적합 + 투 포인터를 활용해서 풀 수 있는 문제.

어떻게 적용해야 할지 감이 안 와서... 공식풀이와 풀이포스트를 참고했다.

 

 

from datetime import datetime
# 문자열을 sec로 변환하는 메소드
def convert_to_seconds(time):
time = map(int, time.split(":"))
result = 0
for t, sec in zip(time, [3600, 60, 1]):
result += t * sec
return result;
# sec를 문자열로 반환하는 메소드
def seconds_to_time(seconds):
s = seconds % 60
seconds //= 60
m = seconds % 60
seconds //= 60
h = seconds
return '{:02d}:{:02d}:{:02d}'.format(h, m, s)
def solution(play_time, adv_time, logs):
# 초로 변환
play_sec = convert_to_seconds(play_time)
adv_sec = convert_to_seconds(adv_time)
# 각 구간별 누적합을 계산하기 위한 배열
cum_played = [0 for _ in range(360001)]
for log in logs:
log = log.split("-")
# 시작 시간
cum_played[(convert_to_seconds(log[0]))] += 1
# 끝나는 시간
cum_played[(convert_to_seconds(log[1]))] -= 1
# 각 구간별 재생횟수 구하기
for idx in range(1, play_sec + 1):
cum_played[idx] += cum_played[idx-1]
# 각 구간별 재생횟수의 누적합 = 누적 재생시간 (초)
for idx in range(1, play_sec + 1):
cum_played[idx] += cum_played[idx-1]
# 시작지점부터 play_time까지 -> 누적합의 최댓값을 리턴하는 초를 찾는다.
max_sum_time = 0
# 00초부터 시작했을 때의 누적합 최댓값을 기본으로 잡는다.
max_sum_played = cum_played[adv_sec]
for start_time in range(1, play_sec):
end_time = start_time + adv_sec if start_time + adv_sec < play_sec else play_sec
sum_played = cum_played[end_time] - cum_played[start_time]
if max_sum_played < sum_played:
max_sum_played = sum_played
max_sum_time = start_time + 1
return seconds_to_time(max_sum_time)

 

반응형