[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]])
Author And Source
이 문제에 관하여([Level 2] 다리를 지나는 트럭), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@t1won/Level-2-다리를-지나는-트럭저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)