강의로 돌아가기
Jang Sungil

저는 탐욕법으로 했습니다. (코드 있음)

저는 냅다 풀어서 제출해보니, 푸신분 대부분이 탐욕법이네요.

어차피 가장 긴 집까지 가야하므로
뒤에서부터 출발하면 해결법의 절반은 도달했고(프로그래머스 연습문제에 비슷한게 있었죠... 주식, 부대이동 등..)
나머지 절반은 pickups, delivers에서 최적의 위치를 찾는 것인데

보면 문제 안내와 달리
귀가하는 택배차량에 짐이 없다고 생각하여
배송할 짐칸, 회수할 짐칸 따로 만들었습니다.

비운 상태에서 처음 짐을 싣을 경우의 위치를
두 배열에서 각각 찾아 각각의 큐에 넣고
계속 택배차량에 넣으면서 차면 비우고
시작점까지 오게 합니다.

큐에서 같이 꺼낼때
그 위치중에 큰 거를 왕복거리로 했습니다.
.
.
.
.
.

작성중인 코드―solution.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
"""
탐욕법(greedy)
[1, 0, 3, 1, 2]
[0, 3, 0, 4, 0]

뒤에서부터 시작하여 0이상 싣게될때 위치
두 배열이 넘칠때 위치에서 비움
같은 위치에서 반복가능

two pointer
시간복잡도: O(c*n)
공간복잡도: O(c*n)
"""
from collections import deque

def solution(cap, n, deliveries, pickups):
    answer = 0

    deliveries_end = deque()
    pickups_end = deque()
    loads = [0, 0]
    d_index = len(pickups) - 1
    p_index = len(pickups) - 1

    while d_index > -1:
        diff = loads[0] + deliveries[d_index] - cap
        if loads[0] == 0 and deliveries[d_index] > 0:
            deliveries_end.append(d_index)
        if diff <= 0:
            loads[0] += deliveries[d_index]
            deliveries[d_index] = 0
        elif diff > 0:
            deliveries[d_index] -= cap - loads[0]
            loads[0] = 0
            continue
        d_index -= 1
    while p_index > -1:
        diff = loads[1] + pickups[p_index] - cap
        if loads[1] == 0 and pickups[p_index] > 0:
            pickups_end.append(p_index)
        if diff <= 0:
            loads[1] += pickups[p_index]
            pickups[p_index] = 0
        elif diff > 0:
            pickups[p_index] -= cap - loads[1]
            loads[1] = 0
            continue
        p_index -= 1

    if len(deliveries_end) > 0 and len(pickups_end) > 0:
        min_len = len(deliveries_end) if len(deliveries_end) < len(pickups_end) else len(pickups_end)
        for _ in range(min_len):
            d_last = deliveries_end.popleft()
            p_last = pickups_end.popleft()
            answer += 2 * (p_last + 1 if p_last > d_last else d_last + 1)
        while len(deliveries_end) > 0:
            answer += 2 * (deliveries_end.popleft() + 1)
        while len(pickups_end) > 0:
            answer += 2 * (pickups_end.popleft() + 1)

    return answer
  • JungSangHyup

    오잉 배달상자, 회수상자 따로 해도 되는구나 ㄷㄷ

    JungSangHyup―2023.01.08 16:03
0 개의 답변
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.