Algorithm/프로그래머스

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

poppy 2021. 5. 25. 13:25
반응형

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

 

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

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

programmers.co.kr

처음에는 다리를 지난 트럭, 다리를 건너는 트럭 리스트를 따로 만들고, 각 트럭의 상태를 따로 저장해야되나 이런 저런 생각을 했다. 리스트도 너무 많고 너무 복잡해서 어디서부터 코드를 짜야할지 모르겠어서 검색해보니 다리를 건너는 트럭을 큐로 하면된다는 사실을 알고!! 그 뒤부터는 내가 코드를 짰다. 다리를 건너는 트럭 리스트를 큐로 구현하면 쉽게 해결되는 것이었다!

def solution(bridge_length, weight, truck_weights):
    answer = 0
    cross = [0] * bridge_length # 다리를 건너는 트럭 리스트
    
    # 다리를 지나는 시간 계산
    while cross:
        answer += 1
        cross.pop(0)
        
        if truck_weights:
            if sum(cross) + truck_weights[0] <= weight:
                cross.append(truck_weights.pop(0))
            else: 
                cross.append(0)
    
    return answer

cross는 다리를 건너는 트럭 리스트인데 이렇게만 쓰면 이해가 잘 안될 것입니다. 예를 들어 다리의 길이가 3이라면 cross = [0,0,0] 이 되고 truck_weights = [7, 4, 5] 라고 하겠습니다. 다음 표를 보면 쉽게 이해될 것입니다.

 

time cross
1 [0, 7]
2 [7, 0]
3 [0, 4]
4 [4, 5]
5 [5]
6 []

 

cross를 pop(0) 하여 맨 앞에 있는 트럭을 내보내고 append() 하여 트럭이 들어오게 하는 것입니다. while문을 통해 cross에 값이 없을 때까지 트럭을 내보내고 들어오는 과정을 반복합니다. truck_weights를 대기트럭 리스트로 사용하여 리스트에 남아있는 트럭이 있는 경우 weight보다 크거나 같으면 cross에 트럭을 추가하고 그렇지 않으면 0을 추가하여 아무 트럭도 들어오지 않도록 합니다. 더 이상 대기하는 트럭도 없고 다리를 건너는 트럭도 없으면 반복문을 빠져나오고 다리를 지나는 시간(answer)을 리턴해줍니다.

 

반응형