본문 바로가기
Algorithm/프로그래머스

[프로그래머스] [Python] Level2_다리를 지나는 트럭

by 은세라 2021. 8. 4.

https://programmers.co.kr/learn/courses/30/lessons/42583

 

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

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

programmers.co.kr

1차 시도 - Fail

모든 내려가고 올라가고를 조건을 주면서 하나하나 추가하다보니 너무 방대해지고

중간중간에 내려가고나서 pop해둔 load_truck이 날아가고 이래서 기각...

from collections import deque

def solution(bridge_length, weight, truck_weights):
    answer = 0
    sum = 0 #다리에 올라가있는 총 무게
    bridge = deque() #len(bridge_length)
    
    while truck_weights or bridge:
        if truck_weights:
            load_truck = truck_weights.pop(0)
            sum += load_truck
            
        #무게가 덜됐으면 하나 올라감
        if sum < weight:  
            bridge.append(load_truck) #하나 올라감
            answer += 1
            
        #무게가 다찼음 (하나 내리고 하나 올림)  
        while sum >= weight and bridge: 
            unload_truck = bridge.popleft()
            sum -= unload_truck #하나 내려감
            answer += 1     
                
        #길이가 다 찼음  
        if len(bridge) == bridge_length : 
            unload_truck = bridge.popleft()
            sum -= unload_truck #하나 내려감
            answer += 1
    
    return answer

2차 시도

from collections import deque

def solution(bridge_length, weight, truck_weights):
    answer = 0
    bridge = [0 for i in range(bridge_length)] #빈 도로는 0
    
    while bridge:
        answer += 1
        bridge.pop(0) #다리에서 pop 일단 out
        if truck_weights:
            if sum(bridge) + truck_weights[0] <= weight: #무게가 덜되어서 올릴 수 있음
                bridge.append(truck_weights.pop(0))
            else: #무게초과
                bridge.append(0) 
                print(bridge)
    
    return answer

💡최종로직

0. 정답으로 return할거 선언

0. 0으로 도로 초기화

1. bridge가 차 있는 동안

  answer++ (모든 움직임은 1초씩 차지함 )

  다리 맨앞에 있는 것 pop (0을 pop한다는 건 뒤에 있는 것들이 한칸씩 앞으로 이동할 자리를 만드는 것)

  truck을 다 bridge에 올렸다 해도 bridge길이 만큼 이동 시간이 걸리기때문에 다 answer++를 해줘야함

  1-1. truck을 다 쓸 동안

    1-1-1. bridge 총 무게 + 다음 차 무게가 weight보다 작으면  무게가 덜 되니 다리에 더 올릴 수 있음

    1-1-2. 무게가 초과면 0을 append해서 한칸씩 이동하게 만듦

댓글