PS/Python

[PYTHON] 프로그래머스 #42583 다리를 지나는 트럭

yoo.o 2020. 3. 15. 02:30
반응형

문제

 

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

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

programmers.co.kr

 

 

 

나의 풀이

 

트럭의 길이에 꽂혀서 초반에 문제를 이해하는데 오래걸렸다. 트럭의 길이는 1이었음

bridge_length 길이의 배열을 만들어서 0으로 채워주고, 큐를 사용해서 insert와 pop으로 풀었다.

맨날 append랑 기본 pop만 사용하다가 살짝 당황했다

 

arr.insert(n, x) -> arr[n]에 x넣기 (나머지는 뒤로 밀림)

arr.pop(0), arr.popleft() -> 맨 앞 pop하기

def solution(bridge_length, weight, truck_weights):

    count = 0
    arr = bridge_length * [0]

    while True:
        #  맨 뒤 나가기
        arr.pop()
        if (truck_weights[0] + sum(arr)) <= weight:
            #  맨 앞에 추가
            arr.insert(0, truck_weights.pop(0))
        else:
            arr.insert(0, 0)
        count += 1
        if len(truck_weights) == 0:
            break

    return count + bridge_length

 

근데 테스트 5에서 시간초과가 났다

 

 

sum()은 O(N)이라 이 부분에서 시간이 오래 걸린다는 조언을 보고 current로 바꿔줬다

def solution(bridge_length, weight, truck_weights):
    # count : 소요 시간 
    # arr : 다리의 길이만큼 배열 생성
    # current : 현재 다리 위의 무게의 합
    
    count = 0 
    arr = bridge_length * [0]
    current = 0 

    while True:
        #  맨 뒤 트럭 나가기
        current -= arr.pop() 
        
        if (truck_weights[0] + current) <= weight:
        #  맨 앞에 새 트럭 추가
            arr.insert(0, truck_weights.pop(0)) 
            current += arr[0]
        else:
            arr.insert(0, 0)
            
        count += 1
        
        #  대기 트럭이 더이상 없으면 break
        if len(truck_weights) == 0:
            break

	#  지금까지 소요시간 + 마지막 트럭이 다리를 끝까지 건너는데 걸리는 시간 리턴
    return count + bridge_length 

sum이 포문을 돌면서 다 더하는거라더니 진짜 시간이 오래걸리나보다

이렇게 바꿔주니까 채점도 훨씬 빨리 끝남!!

 

 

 

 

반응형