본문 바로가기

개발/algorithm

[프로그래머스][level3] 광고 삽입 -python

문제 링크

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

 

카카오 풀이 링크

https://tech.kakao.com/2021/01/25/2021-kakao-recruitment-round-1/

 

2021 카카오 신입공채 1차 온라인 코딩 테스트 for Tech developers 문제해설

지난 2020년 9월 12일 토요일 오후 2시부터 7시까지 5시간 동안 2021 카카오 신입 개발자 공채 1차 코딩 테스트가 진행되었습니다. 테스트에는 총 7개의 문제가 출제되었으며, 개발 언어는 C++, Java, Jav

tech.kakao.com

 

풀이 - 다른 블로그 참고 

1. 전체 시간, 광고 시간 초 단위로 변경 

 

2. 모든 로그들에 대해 시작 시간과 종료 시간 초단위로 변경 후, all_time[start]는 +1 . all_time[end]는 -1 

all_time[i] = i 시각에 시청 중인 사람의 수 

start에서는 누군가 시청을 시작했으므로 +1 , end에서는 누군가 시청을 종료했으므로 -1 

시작과 끝만 표시해주고, 이 후 누적 기록 과정에서 모든 부분 표시 

 

3. 구간 별 시청자 수 기록 

all_time[i] = all_time[i-1] + all_time[i] = (i-1)부터 i까지, 1초동안의 시청자 수 

2번에서 표시해준 시작과 끝을 바탕으로 모든 구간에 시청자 수 표시 

 

4. 모든 구간 시청자 누적 기록 

all_time[i] = all_time[i-1] + all_time[i]  = 0초 부터 i초 까지의 누적 시청자 수 

 

5. 누적된 시청자 수를 바탕으로, 가장 시청자수가 많은 부분 탐색 

most_view = all_time[i] - all_time[i-adv]

def solution(play_time, adv_time, logs):
  
  # 전체 시간, 광고 시간 초단위로 변경 
  play = time_compute(play_time)
  adv = time_compute(adv_time)

  # i 시각에서 시청중인 사람의 수 
  all_time = [0 for i in range(play+1)]

  # 로그 별 시작 시간, 종료 시간 초단위로 변경 
  # 시청중인 사람 수 표시 
  for l in logs:
    start, end = l.split("-")
    start = time_compute(start)
    end = time_compute(end)

    all_time[start] += 1 
    all_time[end] -= 1 

  # 구간 별 시청자 수 구하기
  for i in range(1, len(all_time)):
    all_time[i] = all_time[i-1] + all_time[i]

  # 누적 시청자 수 구하기 
  for i in range(1, len(all_time)):
    all_time[i] = all_time[i-1] + all_time[i]

  most_view = 0 
  max_time = 0 

  for i in range(adv -1 , play):
    if i >= adv :
      if most_view < all_time[i] - all_time[i -adv]:
        most_view = all_time[i] - all_time[i-adv]
        max_time = i - adv + 1 
    else:
      if most_view < all_time[i]:
        most_view = all_time[i]
        max_time = i - adv + 1 
  
  return time_change(max_time)

# string 형식으로 표시된 시간 초단위로 변경 
def time_compute(time):
  h, m, s = time.split(":")
  return int(h) * 3600 + int(m)* 60 + int(s)

# 초단위로 표시된 시각 string 형식으로 변경 
def time_change(time):
  h = time // 3600 
  h = '0' + str(h) if h < 10 else str(h)
  time = time % 3600
  m = time // 60
  m = '0' + str(m) if m < 10 else str(m)
  time = time % 60
  s = '0' + str(time) if time < 10 else str(time)

  return h + ":" + m  + ":" + s