반응형
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


누적합 + 투 포인터를 활용해서 풀 수 있는 문제.
어떻게 적용해야 할지 감이 안 와서... 공식풀이와 풀이포스트를 참고했다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
반응형
'프로그래밍 > 코딩테스트 문제풀이' 카테고리의 다른 글
[Python] 프로그래머스. 2021 카카오 인턴 - 숫자 문자열과 영단어 (Level 1) (0) | 2021.07.09 |
---|---|
[Python] 프로그래머스. 스킬트리 (Level 2) (0) | 2021.03.01 |
[Python] 프로그래머스. 2021 카카오 recruit - 순위 검색 (Level 2) (0) | 2021.02.08 |
[Python] 프로그래머스. 2021 카카오 recruit - 메뉴 리뉴얼 (Level 2) (0) | 2021.02.02 |
[Python] 프로그래머스. 2021 카카오 recruit - 신규 아이디 추천 (Level 1) (0) | 2021.02.01 |