본문 바로가기

⏳ 알고리즘/python 알고리즘 문제 풀이

알고리즘 문제 - LV2. 다리를 지나는 트럭

문제

https://programmers.co.kr/learn/courses/30/lessons/42583?language=python3 

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈

programmers.co.kr

 

내 풀이

def solution(bridge_length, weight, truck_weights):
    answer = 0
    waiting = truck_weights
    length_truck = len(truck_weights)
    crossed = []   # 지나간 트럭
    going = []     # 지나가고 있는 트럭
    on_the_bridge = []  

    while len(crossed) != length_truck:
        for i in range(len(going)): 
            going[i] += - 1
        if going and going[0] == 0:
            del going[0] #가고있던 트럭 삭제
            crossed.append(on_the_bridge.pop(0))  #다 지나간 다리위에 트럭을 crossed에 추가
        if waiting and weight >= sum(on_the_bridge) + waiting[0]: #대기중인 트럭중 맨 앞의 트럭과 다리위의 트럭 총합이 weight보다 작다면
            on_the_bridge.append(waiting.pop(0)) #대기중이던 트럭을 다리위에 추가
            going.append(bridge_length)  
            print(going)
        answer += 1
    return answer

 

다른 풀이

다른 풀이1. lambda이용

def solution(bridge_length, weight, truck_weights):
    answer = 1
    before_list = [] # 다리 건너는 트럭
    while truck_weights or before_list:
        if truck_weights and weight >= truck_weights[0]:
            trcuk_val = truck_weights.pop(0)
            before_list.append([trcuk_val, 1])
            weight -= trcuk_val
        while before_list and before_list[0][1] == bridge_length:
            weight += before_list.pop(0)[0]
        before_list = list(map(lambda x:[x[0],x[1]+1], before_list))
        answer += 1
    return answer

 

다른 코드2. 

def solution(bridge_length, max_weight, truck_weights):
    # FIFO 문제.
    bridge = [0]*bridge_length
    curr_weight = 0
    ans = 0
    while len(truck_weights) > 0:
        ans += 1
        ar = bridge.pop(0)
        curr_weight -= ar
        if curr_weight + truck_weights[0] > max_weight:
            bridge.append(0)            
        else:
            truck = truck_weights.pop(0)
            bridge.append(truck)
            curr_weight += truck
    while curr_weight > 0:
        ans += 1
        ar = bridge.pop(0)
        curr_weight -= ar
    return ans

 

최근 다시 풀어봄

def solution(bridge_length, weight, truck_weights):
    bridge = [0] * bridge_length
    time = 0
    truck_weights.reverse()
    
    while len(truck_weights) > 0:
        bridge.pop(0)
        if truck_weights[-1] + sum(bridge) <= weight:
            bridge.append(truck_weights.pop())
        else:
            bridge.append(0)

        time += 1
            
    return time + bridge_length