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

박노정·2021년 6월 7일
0

알린이의 알고리즘

목록 보기
2/15

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

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈 수 있으며, 다리는 weight 이하까지의 무게를 견딜 수 있습니다. 단, 다리에 완전히 오르지 않은 트럭의 무게는 무시합니다.

def solution(bridge_length, weight, truck_weights):
    answer = 0
    on_bridge = [0] * bridge_length
    flag = len(truck_weights)
    gone = []
    while flag != len(gone):
        answer += 1
        for i in range(len(on_bridge)):
            if on_bridge[i]:
                if i == 0:
                    gone.append(on_bridge[i])
                    on_bridge[i] = 0
                else:
                    on_bridge[i-1] = on_bridge[i]
                    on_bridge[i] = 0
        if truck_weights and ((sum(on_bridge) + truck_weights[0]) <= weight):
            on_bridge[-1] = truck_weights.pop(0)
    return answer

이 코드는 시간 초과가 났다. 아무래도 while문 안에 for문이 문제인것같다.
그래서 곰곰히 생각해봤다. 흠....

나는 다리 길이만큼의 스택을 유지하기위해 for문으로 검사를 하고 인덱스값을 바꿔주고 했다. pop()을 하면 다리길이가 짧아질거라는 생각에

근데 for문을 없애야 시간을 줄일 수 있으니 없는 방향으로 한번 생각해봤다.

def solution(bridge_length, weight, truck_weights):
    answer = 0
    on_bridge = [0] * bridge_length

    while truck_weights:
        answer += 1
        on_bridge.pop(0)
        if truck_weights and ((sum(on_bridge) + truck_weights[0]) <= weight):
            on_bridge.append(truck_weights.pop(0))
        else:
            on_bridge.append(0)
    return answer+len(on_bridge)

이걸로 통과했다. 그냥 트럭이 못들어가면 0, 아니면 트럭을 append()시켜주고 매순간 pop() 시켜주면 다리길이는 유지되고 반복문하나가 날라가게했다.
그래서 마지막에 트럭이 다 올라가고나면 다리의 길이 + 이때까지 지난 시간을 더해 총 걸린시간을 return했다.

결국 좀 더 빠른 코드가 완성이 되었다. 문제도 통과했다. (거의 원래의 코드에서 반복문만 뺀 수준이다;;)

오늘의 교훈 : 설계를 잘하자~

profile
성장스택 쌓고있는 개발자🏋

0개의 댓글