[프로그래머스] 다리를 지나는 트럭 (python)



문제 설명





Idea
  1. 다리 길이에 해당하는 '다리를 건너는 다리 리스트' 필요
  2. 트럭 리스트에서 다리로 넘어가면 넘어간 트럭은 리스트에서 제거
  3. 시간은 다리를 건널때 마다 1초씩 증가
  4. 다리를 다 건너면 다리 리스트에서 트럭 제거
  5. 트럭 리스트가 빌 때까지 반복
고려 조건
  • 다리 리스트에 올라온 트럭 + 올라올 트럭 무게가 다리 무게보다 크면 트럭은 올라가지 않고 대기
  • 다리 리스트에 올라온 트럭 + 올라올 트럭 무게가 다리 무게보다 작으면 트럭은 올라감



Solution

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

다리 길이 2, 무게 10, 트럭 4,5 kg으로 가정하고 설명합니다.

trucks(다리 위 트럭)의 무게를 축적하는 total_w를 두어 새로운 트럭을 trucks에 추가할 수 있으면 truck_weights에서 트럭을 뺐습니다 (pop).

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

다리 길이 2, 무게 10, 트럭 4,5 kg으로 가정하고 설명합니다.

다리 길이만큼 트럭이 다리를 지날 수 있는 bridge를 생성하여 0으로 초기화합니다.
이후 truck_weights가 없어질 때까지 루프를 돕니다.

bridge 맨 앞 배열을 제거하면서 total_w을 빼줍니다. (다리 위 누적 무게 계산 목적)
이후 새로운 트럭이 다리위에 올라올 수 있다면 truck_weights에서 맨 앞 트럭을 제거하고 bridge에 추가합니다.
만약 새로운 트럭을 다리위에 올릴 수 없다면 0이라는 수를 새롭게 추가합니다. (다리 길이 2 유지 목적)

트럭이 다리위에 올라올 수 있으면 트럭을, 그렇지 않으면 0이라는 수를 입력하면서 step +1을 해줍니다.

마지막 truck_weights가 빈칸이 된다면 마지막 트럭이 다리를 건너기 전에 루프문이 끝나게 됩니다.
마지막 트럭에 대한 step이 추가되지 않기 때문에 루프를 빠져나오면 다리 길이만큼 step을 추가해줍니다.


댓글

이 블로그의 인기 게시물

[opencv-python] 이미지 크기조절(resize) 하는 법

[python] selenium close와 quit 차이점

[python]파이썬: csv reader header skip (첫번째 행 무시하기, 안읽기)