1 minute read

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)


채점 결과

  • 오답(시간 초과)

리뷰

  • 각 구간에 대하여 체크포인트를 설정하고, 해당 체크포인트보다 곡의 플레이타임이 짧을경우 보정치를 더해주는 방식으로 진행했다.

  • 반복문의 단축을 위해 최대한 수법을 써보았으나, 전부 시간초과가 나는것으로 볼때 다른 방법을 써야할것 같다.

  • 사용된 알고리즘은 그리디 알고리즘이다.