제로베이스 20220406 코테 연습
1. 다운로드
-
택희는 인터넷에서 노래를 다운받으려고 한다. 노래는 여러 조각으로 나누어져 있고, 정해진 순서대로 다운받아야 한다. 택희는 각 조각의 노래 길이와 다운로드 길이를 알고 있다.
-
택희는 노래를 모두 다운받기 전에 들으려고 한다. 음악이 중간에 끊여지면 분위기를 망치기 때문에, 한 번 듣기 시작하면 노래는 멈추지 않고 끝까지 재생해야 한다. 각 조각을 들으려면 그 조각을 모두 다운로드 해야 들을 수 있다.
-
택희가 음악을 끊김없이 들으려면, 다운로드 시작한지 몇 초 후에 들으면, 끊김 없이 노래를 들을 수 있는지 구하는 프로그램을 작성하시오.
입력
-
첫째 줄에 조각의 수 N이 주어진다. (1 ≤ N ≤ 100,000)
-
다음 N개의 줄에는 노래의 길이 D와 다운로드하는데 걸리는 시간 V가 주어진다. (1 ≤ D,V ≤ 1000)
출력
- 첫째 줄에, 다운로드 시작하고 몇 초 후에 노래를 듣기 시작하면, 끊김 없이 들을 수 있는지 출력한다. 그러한 시간이 여러개라면, 가장 빠른 것을 출력한다.
풀이
import sys
N = int(sys.stdin.readline())
D_arr = []
V_arr = []
D_ckpt = []
V_ckpt = []
for _ in range(0, N):
D, V = list(map(int, sys.stdin.readline().split()))
D_arr.append(D)
V_arr.append(V)
D_ckpt.append(sum(D_arr))
V_ckpt.append(sum(V_arr))
flag = True
pointer = sum(V_arr) - sum(D_arr) if sum(V_arr) - sum(D_arr) > 0 else 1
ckpt = 0
while flag:
for i in range(ckpt, N):
print(pointer + D_ckpt[i] , V_ckpt[i])
if pointer + D_ckpt[i] < V_ckpt[i]:
pointer += V_ckpt[i]-(pointer + D_ckpt[i]) + 1
break
elif pointer + D_ckpt[i] > V_ckpt[i] and i == N - 1:
flag = False
break
elif i == N-1:
pointer += 1
else:
ckpt = i+1
if pointer > V_ckpt[-1]:
break
print(pointer)
채점 결과
- 오답(시간 초과)
리뷰
-
각 구간에 대하여 체크포인트를 설정하고, 해당 체크포인트보다 곡의 플레이타임이 짧을경우 보정치를 더해주는 방식으로 진행했다.
-
반복문의 단축을 위해 최대한 수법을 써보았으나, 전부 시간초과가 나는것으로 볼때 다른 방법을 써야할것 같다.
-
사용된 알고리즘은
그리디 알고리즘
이다.