https://school.programmers.co.kr/learn/courses/30/lessons/72414
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
프로그래머스 - 광고 삽입 (72414번)
난이도 : Lv 3
알고리즘 : Prefix Sum (누적 합)
풀이 소요 시간 : 100 mins
def ttos(x):
h, m, s = map(int, x.split(':'))
return h*3600 + m*60 + s
def solution(play, adv, logs):
play = ttos(play)
adv = ttos(adv)
memo = [0] * (play+1)
for log in logs:
s, e = log.split('-')
memo[ttos(s)] += 1
memo[ttos(e)] -= 1
for i in range(play):
memo[i+1] += memo[i]
cur = sum(memo[:adv])
maxy = (0, cur)
for i in range(play-adv):
cur += memo[i+adv] - memo[i]
if maxy[1] < cur:
maxy = (i+1, cur)
h, maxy = divmod(maxy[0], 3600)
m, s = divmod(maxy, 60)
return ':'.join(map(lambda x: str(x).rjust(2, '0'), (h, m, s)))
누적 합을 활용하는 문제이다.
① "HH:MM:SS" 형태의 시간을 초 단위 int로 변환한다.
② 0으로 초기화 된, (play_time + 1) 길이의 리스트 "memo"를 만든다.
③ logs의 각 log에 대해,
시작시간 s → memo[s] += 1
종료시간 e → memo[e] -= 1
작업을 진행한다.
④ memo의 앞에서부터 차례대로 누적합을 구해준다.
for i in range(play_time):
memo[i+1] += memo[i]
⑤ memo의 앞에서부터
adv_time 길이만큼의 구간 합을 계산하고,
그 중 값이 가장 크면서 시작 시간이 가장 빠른 값을 출력한다.
'Algorithm' 카테고리의 다른 글
카드 짝 맞추기 (72415번) - 프로그래머스 (Programmers) (0) | 2023.06.21 |
---|---|
욕심쟁이 판다 (1937번) - 백준 (BOJ) (0) | 2023.06.21 |
기타 레슨 (2343번) - 백준 (BOJ) (0) | 2023.06.18 |
합승 택시 요금 (72413번) - 프로그래머스 (Programmers) (0) | 2023.06.17 |
k진수에서 소수 개수 구하기 (92335번) - 프로그래머스 (Programmers) (0) | 2023.06.16 |