실패1
def strToTime(str):
str = str.split(':')
return int(str[0]) * 3600 + int(str[1]) * 60 + int(str[2])
def timeToStr(time):
h = time // 3600
time = time % 3600
m = time // 60
sec = time % 60
return f'{h:0{2}d}:{m:0{2}d}:{sec:0{2}d}'
def solution(play_time, adv_time, logs):
play_time = strToTime(play_time)
adv_time = strToTime(adv_time)
timeArr = [0] * play_time
logs = list(map(lambda x: x.split('-'), logs))
for i in range(len(logs)):
logs[i][0] = strToTime(logs[i][0])
logs[i][1] = strToTime(logs[i][1])
for i in logs:
for j in range(i[0], i[1]):
timeArr[j] += 1
logs = sorted(logs, key = lambda x: x[0])
maxNum = 0
answer = 0
for start, end in logs:
count = sum(timeArr[start:start+adv_time])
if maxNum < count :
maxNum = count
answer = start
remainTime = adv_time - (play_time - answer)
if remainTime > 0 :
answer -= remainTime
return timeToStr(answer)
시간초과... 두포인터를 활용해서 더해보기로 했다.
실패2
def strToTime(str):
str = str.split(':')
return int(str[0]) * 3600 + int(str[1]) * 60 + int(str[2])
def timeToStr(time):
h = time // 3600
time = time % 3600
m = time // 60
sec = time % 60
return f'{h:0{2}d}:{m:0{2}d}:{sec:0{2}d}'
def solution(play_time, adv_time, logs):
play_time = strToTime(play_time)
adv_time = strToTime(adv_time)
timeArr = [0] * play_time
logs = list(map(lambda x: x.split('-'), logs))
for i in range(len(logs)):
logs[i][0] = strToTime(logs[i][0])
logs[i][1] = strToTime(logs[i][1])
for i in logs:
for j in range(i[0], i[1]):
timeArr[j] += 1
logs = sorted(logs, key = lambda x: x[0])
maxNum = 0
count = sum(timeArr[:adv_time])
answer = 0
l, r = 0, adv_time
while r < play_time :
count = count - timeArr[l] + timeArr[r]
r += 1
l += 1
if count > maxNum :
maxNum = count
answer = l
remainTime = adv_time - (play_time - answer)
if remainTime > 0 :
answer -= remainTime
return timeToStr(answer)
print(solution( "99:59:59", "25:00:00", ["69:59:59-89:59:59", "01:00:00-21:00:00", "79:59:59-99:59:59", "11:00:00-31:00:00"]))
print(solution("00:00:20", "00:00:05",["00:00:14-00:00:18", "00:00:01-00:00:05", "00:00:02-00:00:06", "00:00:16-00:00:20"]))
전보다는 개선되었지만 이 역시 시간초과... 현재 시점의 시청자수를 구하는걸 미리 배열로 만들어놓지 않고 순회하면서 찾는 것으로 변경해보기로 했다.
성공!
def strToTime(str):
str = str.split(':')
return int(str[0]) * 3600 + int(str[1]) * 60 + int(str[2])
def timeToStr(time):
h = time // 3600
time = time % 3600
m = time // 60
sec = time % 60
return f'{h:0{2}d}:{m:0{2}d}:{sec:0{2}d}'
def solution(play_time, adv_time, logs):
play_time = strToTime(play_time)
adv_time = strToTime(adv_time)
timeArr = [0] * play_time
logs = list(map(lambda x: x.split('-'), logs))
for i in range(len(logs)):
logs[i][0] = strToTime(logs[i][0])
logs[i][1] = strToTime(logs[i][1])
logLen = len(logs)
logs = sorted(logs, key = lambda x: x[0])
enter = list(map(lambda x : x[0], logs))
out = list(map(lambda x: x[1], logs))
enter.sort()
out.sort()
enter_cur = 0
out_cur = 0
viewer = 0
for t in range(len(timeArr)):
while enter_cur < logLen and t == enter[enter_cur] :
viewer += 1
enter_cur+=1
while out_cur < logLen and t == out[out_cur]:
viewer -= 1
out_cur += 1
timeArr[t] = viewer
# max값 찾는 변수 maxNum에다가 첫번째 count를 주지 않으면 00:00:00은 고려안함
# 그래서 테스트 케이스 9,31 만틀리게 됨
count = sum(timeArr[:adv_time])
maxNum = count
answer = 0
l, r = 0, adv_time
while r < play_time:
count = count - timeArr[l] + timeArr[r]
r += 1
l += 1
if count > maxNum:
maxNum = count
answer = l
remainTime = adv_time - (play_time - answer)
if remainTime > 0 :
answer -= remainTime
return timeToStr(answer)
테스트 케이스 9, 31만 틀리시는 분들 참고...
'컴퓨터 > 코테' 카테고리의 다른 글
백준 2156 - 포도주 [dp] (0) | 2021.08.26 |
---|---|
카카오 기출 - 키패드 누르기 (0) | 2021.08.24 |
카카오 2021 기출 - 합승 택시요금 [워셜 플로이드] (0) | 2021.08.23 |
백준 11559 [bfs] (0) | 2021.08.18 |
프로그래머스 - 거리두기 확인 (카카오 2021 인턴) (0) | 2021.08.14 |