[프로그래머스] 다리를 지나는 트럭 (python)
문제 설명
Idea
- 다리 길이에 해당하는 '다리를 건너는 다리 리스트' 필요
- 트럭 리스트에서 다리로 넘어가면 넘어간 트럭은 리스트에서 제거
- 시간은 다리를 건널때 마다 1초씩 증가
- 다리를 다 건너면 다리 리스트에서 트럭 제거
- 트럭 리스트가 빌 때까지 반복
고려 조건
- 다리 리스트에 올라온 트럭 + 올라올 트럭 무게가 다리 무게보다 크면 트럭은 올라가지 않고 대기
- 다리 리스트에 올라온 트럭 + 올라올 트럭 무게가 다리 무게보다 작으면 트럭은 올라감
Solution
trucks(다리 위 트럭)의 무게를 축적하는 total_w를 두어 새로운 트럭을 trucks에 추가할 수 있으면 truck_weights에서 트럭을 뺐습니다 (pop).
def solution(bridge_length, weight, truck_weights):
total_w = 0
trucks = []
running_time = 1
while 1:
if truck_weights and (total_w + truck_weights[0]) <= weight and len(trucks) < bridge_length:
tw = truck_weights.pop(0)
total_w += tw
trucks.append([tw, 0, 0])
trucks[0][1] += 1
for t in trucks:
t[2] += 1
if trucks[0][2] >= bridge_length:
tw = trucks.pop(0)
total_w -= tw[0]
running_time += tw[1]
if not truck_weights and not trucks:
break
return running_time
total_w = 0
trucks = []
running_time = 1
while 1:
if truck_weights and (total_w + truck_weights[0]) <= weight and len(trucks) < bridge_length:
tw = truck_weights.pop(0)
total_w += tw
trucks.append([tw, 0, 0])
trucks[0][1] += 1
for t in trucks:
t[2] += 1
if trucks[0][2] >= bridge_length:
tw = trucks.pop(0)
total_w -= tw[0]
running_time += tw[1]
if not truck_weights and not trucks:
break
return running_time
다리 길이 2, 무게 10, 트럭 4,5 kg으로 가정하고 설명합니다.
trucks는 (트럭무게, trucks 맨 앞 트럭이 다리를 지나는 시간, 트럭이 다리를 지나는 전체 시간)으로 구성했습니다.
'trucks 맨 앞 트럭이 다리를 지나는 시간'은 4가 지날때 +2(다리 길이만큼), 5가 지날 때 +1(4가 아직 다리를 건너는 동안 5가 올라왔기 때문에 1초는 카운트 X)을 하기 위한 목적입니다.
trucks가 비어있다가 새로운 트럭이 추가되면 '맨 앞 트럭이 다리를 지나는 시간'과 '트럭이 다리를 지나는 전체 시간' +1
만약 trucks에 트럭이 있는데 새로운 트럭이 올라오면 '트럭이 다리를 지나는 전체 시간'에만 +1을 해줍니다.
이로서 '트럭이 다리를 지나는 전체 시간'이 다리 길이(2)와 동일해지면 trucks에 있는 맨 앞 트럭을 제거하고 '맨 앞 트럭이 다리를 지나는 시간'을 카운트 해주는 방식으로 문제를 풀었습니다.
refactoring
def solution(bridge_length, weight, truck_weights):
total_w = 0
bridge = [0] * bridge_length
step = 0
while truck_weights:
total_w -= bridge.pop(0)
if (total_w + truck_weights[0]) <= weight:
tw = truck_weights.pop(0)
total_w += tw
bridge.append(tw)
else:
bridge.append(0)
step += 1
step += bridge_length
return step
total_w = 0
bridge = [0] * bridge_length
step = 0
while truck_weights:
total_w -= bridge.pop(0)
if (total_w + truck_weights[0]) <= weight:
tw = truck_weights.pop(0)
total_w += tw
bridge.append(tw)
else:
bridge.append(0)
step += 1
step += bridge_length
return step
다리 길이 2, 무게 10, 트럭 4,5 kg으로 가정하고 설명합니다.
다리 길이만큼 트럭이 다리를 지날 수 있는 bridge를 생성하여 0으로 초기화합니다.
이후 truck_weights가 없어질 때까지 루프를 돕니다.
bridge 맨 앞 배열을 제거하면서 total_w을 빼줍니다. (다리 위 누적 무게 계산 목적)
이후 새로운 트럭이 다리위에 올라올 수 있다면 truck_weights에서 맨 앞 트럭을 제거하고 bridge에 추가합니다.
만약 새로운 트럭을 다리위에 올릴 수 없다면 0이라는 수를 새롭게 추가합니다. (다리 길이 2 유지 목적)
트럭이 다리위에 올라올 수 있으면 트럭을, 그렇지 않으면 0이라는 수를 입력하면서 step +1을 해줍니다.
마지막 truck_weights가 빈칸이 된다면 마지막 트럭이 다리를 건너기 전에 루프문이 끝나게 됩니다.
마지막 트럭에 대한 step이 추가되지 않기 때문에 루프를 빠져나오면 다리 길이만큼 step을 추가해줍니다.
댓글
댓글 쓰기