코딩테스트 준비

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

Grey Kang 2021. 3. 1. 14:06
반응형
  • 문제 설명

트럭은 주어진 truck_weights 배열에 있는 대수만큼 있으며 해당 순서대로 weight가 주어져있다

트럭은 1초에 1씩 다리를 지날 수 있다

다리는 주어진 weight만큼만 무게를 견딜 수 있다

이 때 모든 차량이 다리를 빠져나갈 때까지의 최단 시간은 얼마인가?

 

  • 솔루션

해당 문제를 풀 때 삽질을 해서 3중 for문을 써서 풀었지만 어리석은 일이었다

처음에는 시간이 일정하게 흐르기 때문에 시간 배열을 따로 생성하여 차량들이 계속해서 1씩 진행하고 있는

식으로 생각하였으나 이 경우 시간 복잡도에서 문제가 발생되었다.

이 문제는 최소 시간 복잡도가 O(N^2)은 되어야 하는 문제이다

따라서 생각을 바꾸어 다리 위에 있는 차량들만을 생각하여 해당 차량들의 총합계+들어올 차량의 무게가

주어진 weight를 넘지 않을 때라는 조건으로 만들어주고 그 이외의 경우에는 weight를 0으로 하여 실제로는

들어오지 않는 것으로 간주하고 이 때 차량의 대수가 bridge_length와 동일한 경우 한 대씩 차량을 빼주는 것으로 생각하였다

이는 즉, 다리에 차량이 가득 채워져 있을 때 한 대를 밀어낸다는 개념으로 생각하면 된다

따라서 이렇게 진행하게 되면, 문제가 비교적 간단하게 해결될 수 있다.

 

def solution(bridge_length,weight,truck_weights):
    time=0
    go_truck=[] # 다리를 건너고 있는 차

    for tw in truck_weights:
        q_truck=1
        while q_truck!=0:
            if len(go_truck)==bridge_length:
                go_truck.pop()
            
            # weight보다 go_truck에 있는 합이 더 작으면 append 시켜준다
            if sum(go_truck)+tw<=weight:
                time+=1
                q_truck=0
                go_truck.insert(0,tw) # 시간,트럭의 weight
            else:
                time+=1
                q_truck=1
                go_truck.insert(0,0)

    answer=time+bridge_length
    return answer

이는 해당 코드로, 여기서 while문의 경우, q_truck이라는 변수를 집어넣어, 무게를 만족시키지 못해 차량을 밀어넣지 못할 경우 차량을 밀어넣을 수 있을 때까지 반복해주기 위한 장치이다.

반응형