Codepass Expert № 14 · Search · 2025.11
All 14 NN + Time-bounded
PROBLEM № 14 — 2511 Delivery Man

긴 배달은 비싸지만 더 비싸게 친다.

10개 음식점에서 출발하는 2,000개의 배달. 시간 100,000 안에 끝내야 하고, 점수는 3,000 + 300 × 거리. 가까운 배달만 골라 빨리 끝내는 게 답이 아닐 수도 있다.

PASS · SCORE ≥ 140,000,000 map 100² budget 100,000 5 TC
DEEP-DIVE · 심층 분석
배달기사 — 베스트 해법의 정당성과 알고리즘 원리
시간 예산 안 점수 최대화를 분수 배낭으로 정식화, 가성비 정렬의 근사 최적성
심층 분석 읽기 →

§ 1문제 정의

deliver()는 라이더를 src→dest로 자동 이동시키고 그만큼의 시간을 차감한다. 시간이 다 떨어지면 더는 배달할 수 없다. 가성비(점수/시간)가 좋은 배달부터 선택.

각 배달의 가성비 = (3,000 + 300d) / (라이더→src + d). 라이더 현재 위치에서 src가 가까울수록 ‘덤 거리’가 줄어 가성비 증가. 거리 d가 클수록 점수가 비례 증가하지만, 시간도 그만큼 빠진다.

실용적 풀이: 매번 가장 가까운 음식점의 가장 멀리 가는(=점수 큰) 배달부터 선택하면, 평균 가성비가 안정적으로 높다. 라이더 위치를 추적하면서 NN을 반복.

‘싸고 빠른 배달’이 답이 아니다. ‘덤 거리 적은 비싼 배달’이 답이다.

§ 2예제 시각화 — 3 음식점, 8 배달

FIG. 14 — pick best ratio, deliver, repeat STEP 01 / 7
SPACE play/pause · ← → step · R reset

§ 3알고리즘 골격

process(rider, deliveries):
    while time < LIMIT:
        best = null
        for d in remaining:
            move = |rider - d.src|
            dist = |d.src - d.dest|
            if time + move + dist > LIMIT: continue
            ratio = (3000 + 300*dist) / (move + dist)
            if best == null or ratio > best.ratio:
                best = d, best.ratio = ratio
        if best == null: break
        deliver(best.id)
        rider = best.dest
        time += move + dist

§ 4관련 문제