코딩

[프로그래머스] 광고삽입 .py 본문

코딩테스트

[프로그래머스] 광고삽입 .py

ssooyn_n 2021. 2. 18. 16:39

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

 

주의  #1

play_time은 최소 1초이다. 

 

 주의 #2

시간의 범위는 00~99 이다. 통상적인 24:60:60 포맷과는 다르므로

이럴 경우, import time 이나 datetime을 해주면 오류가 난다.

시간을 초로 바꾸어 풀어주는것이 좋다.

 

주의 #3

 

최대 범위는 99:59:59 이를 초로 바꾸어도 1e9값보다 훨씬 작으므로

이럴 경우 모든 초를 배열로 바꾸어 DP를 해주는것이 좋다.

 

 

 

1. time을 seconds로 바꿔주는 메소드

def to_seconds(time):                                                        
    return sum([int(x)*y for x, y in zip(time.split(':'), [3600, 60, 1])]) 

2. seconds를 time으로 바꿔주는 메소드

def to_time(seconds):                                                        
    h, m = divmod(seconds, 3600)                                             
    m, s = divmod(m, 60)                                                     
    return '{:02d}:{:02d}:{:02d}'.format(h, m, s)    

3. 누적된 시간 리스트를 구하는 메소드

def get_accumulated_time(play_list):
    for i in range(1, len(play_list)):                                         
        play_list[i] += play_list[i - 1]                                       
                                                                             
    for i in range(1, len(play_list)):                                          
        play_list[i] += play_list[i - 1]  
    
    return play_list

4. solution

def solution(play_time, adv_time, logs):                                     
                                                                             
    if play_time == adv_time:                                                
        return "00:00:00"                                                    
                                                                 
    play_list = [0] * (to_seconds(play_time) + 1)                            
    adv_time = to_seconds(adv_time)                                          
    play_time = to_seconds(play_time)  
    
    for log in logs:                                                         
        s, e = log.split("-")                                                
        play_list[to_seconds(s)] += 1                                        
        play_list[to_seconds(e)] -= 1                                        
                                                                             
                                  
    play_list = get_accumulated_time(play_list) # 3번
    
    max_viewer = 0                                                              
    answer = 0                                                            
                                                                             
    for i in range(adv_time, play_time+1):
        if max_viewer < play_list[i] - play_list[i - adv_time] :             
                max_viewer = play_list[i] - play_list[i - adv_time]           
                answer = i - adv_time + 1   
                
    if max_viewer <= play_list[adv_time - 1]: # ~ adv_time-1 까지의 구간이 최대면
        answer = 0 # answer은 0초
    
    return to_time(answer)
Comments