[Level 2] 다리를 지나는 트럭

풀이 1

def solution(bridge_length, weight, truck_weights):
    time = 0
    q = [0] * bridge_length  # 다리 길이만큼 0으로 초기화한 큐

    while q:
        time += 1  # 경과 시간
        q.pop(0)  # 다리 위엑서 맨 앞에 있는 것 pop
        if truck_weights:  # 트럭이 남아 있다면
            if sum(q) + truck_weights[0] <= weight:  # 다리 위의 트럭 무게와 다리에 들어갈 트럭 무게 합
                q.append(truck_weights.pop(0))
            else:
                q.append(0)  # 트럭이 안들어가면 0을 append
    return time

다리 길이만큼 0으로 리스트를 초기화 해준다.

이 리스트가 빌 때까지 while 문을 돌면서 push와 pop을 해주는데 다리 위에 트럭 무게 + 새로 들어오는 트럭 무게가 한도를 넘어서지 않으면 트럭을 넣어주고 한도를 초과하면 0을 append 해준다.

트럭을 한 칸 앞으로 이동시키기 위해 다리 위에 있는 트럭을 빼주기 위해 q.pop(0)를 해주고, 트럭을 다리 위에 들어가게 하기 위해서 truck_weight에 있는 트럭을 pop한 후 다리에 append(q.append(truck_weights.pop(0)))해준다.

풀이 2

import collections

DUMMY_TRUCK = 0


class Bridge(object):
    def __init__(self, length, weight):
        self._max_length = length
        self._max_weight = weight
        self._queue = collections.deque()
        self._current_weight = 0

    def push(self, truck):
        next_weight = self._current_weight + truck
        if next_weight <= self._max_weight and len(self._queue) < self._max_length:
            self._queue.append(truck)
            self._current_weight = next_weight
            return True
        else:
            return False

    def pop(self):
        item = self._queue.popleft()
        self._current_weight -= item
        return item

    def __len__(self):
        return len(self._queue)

    def __repr__(self):
        return "Bridge({}/{} : [{}])".format(
            self._current_weight, self._max_weight, list(self._queue)
        )


def solution(bridge_length, weight, truck_weights):
    bridge = Bridge(bridge_length, weight)
    trucks = collections.deque(w for w in truck_weights)

    for _ in range(bridge_length):
        bridge.push(DUMMY_TRUCK)

    count = 0
    while trucks:
        bridge.pop()

        if bridge.push(trucks[0]):
            trucks.popleft()
        else:
            bridge.push(DUMMY_TRUCK)

        count += 1

    while bridge:
        bridge.pop()
        count += 1

    return count


def main():
    print(solution(2, 10, [7, 4, 5, 6]), 8)
    print(solution(100, 100, [10]), 101)
    print(solution(100, 100, [10, 10, 10, 10, 10, 10, 10, 10, 10, 10]), 110)


if __name__ == "__main__":
    main()

Bridge 위에서 일어나는 pop과 push 과정을 클래스로 짠 코드이다. 코드의 짜임새도 좋을 뿐만 아니라 속도도 좋다.

while 문에 객체를 print 해주면 다음과 같이 진행 과정도 한 눈에 볼 수 있게 출력이 된다.

Bridge(0/10 : [[0, 0]])
Bridge(7/10 : [[0, 7]])
Bridge(7/10 : [[7, 0]])
Bridge(4/10 : [[0, 4]])
Bridge(9/10 : [[4, 5]])
Bridge(5/10 : [[5, 0]])

좋은 웹페이지 즐겨찾기