본문 바로가기

Algorithm/Practice

프로그래머스 - 다리를 지나는 트럭 (Python)

문제 설명

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다.

※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다.

예를 들어, 길이가 2이고 10kg 무게를 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.

 

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

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이

programmers.co.kr

 

# 시도

다리에 올라간 트럭의 위치를 리스트로 만들어서 처리하려했는데, 아놔 오래걸린다고.. 채점도 안해줌 ㅠㅠ

def solution(bridge_length, weight, truck_weights):
    answer = 0
    arrived = 0 # 도착한 트럭 수
    n = len(truck_weights) # 전체 트럭 수
    w = 0 # 현재 다리의 무게
    time = 0 # 소요된 시간
    location = [0] * n # 각 트럭의 위치
    temp = [1] * n
    i = 0
    now_bridge = []
    
    while True:
        time = time + 1
        # 다리에 있는 트럭의 위치 +1
        if w + truck_weights[i] <= weight:
            now_bridge.append(i)
            w = w + truck_weights[i]
            i = i + 1
            
        for t in now_bridge:
            location[t] = location[t] + 1
            if location[t] >= bridge_length:
                del now_bridge[t]
                arrived = arrived + 1
                weight = weight - truck_weights[t]
            
        if arrived == n:
            break
            
    return time

 

# 풀이

똑똑한 다른 블로그 염탐 결과, pop(0) 이 포인트~

대단하네~ 내 코드 눈감아... 

주석을 추가했습니다요~

pop과 del의 차이? remove하는 것은 똑같은데 pop은 return 값이 있다.

def solution(bridge_length, weight, truck_weights):
    time = 0 # 소요 시간
    bridge = [0] * bridge_length # 다리에 올라온 트럭의 위치
    
    while len(bridge) != 0: 
        # 더 이상 남은 트럭이 없으면(무게가 넘든 안 넘든 남은 트럭이 있으면 0이 아님)
        time += 1
        print("pre_bridge >> ", bridge)
        bridge.pop(0)
        # bridge의 맨 앞 요소를 pop 하므로써, 1씩 움직이는 걸 구현한다.
        print("time >> ", time)
        print("bridge >> ", bridge)
        print("truck_weights >> ", truck_weights)
        print("sum(bridge) >> ", sum(bridge))
        if truck_weights:
            if sum(bridge) + truck_weights[0] <= weight:
                bridge.append(truck_weights.pop(0)) 
                # 다리에 올라오지 않은 트럭을 pop(0)함으로써 인덱스 처리를 하지 않아도 된다.
            else:
                bridge.append(0)
                # 무게가 넘으면 다리에 올라올 수 없으므로 0으로 채운다.
        
    return time