프로그래밍공부/알고리즘

코딩테스트 - 알고리즘 - 다리를 지나는 트럭

중랑구보안관 2020. 7. 28. 00:27

프로그래머스 코딩테스트의 다리를 지나는 트럭을 풀어보았다.

생각보다 애먹었다 ㅠㅠ

 

문제는 아래와 같다.

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

 

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

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

programmers.co.kr

 

내가 제일 해맸던 부분이 트럭이 얼마만큼 다리를 지나갔는지 체크해야 하는 것인데 이 부분을 잘 못해서 고생했다.

쩃든 아래 내 코드를 한번 보자.

 

def solution(bridge_length, weight, truck_weights):
    
    #기다리고 있는 트럭
    waitTrucks = []
    for truck in truck_weights:
        waitTrucks.insert(0,truck)
        
    #지나가고있는 트럭들.
    goingTrucks = []
    #시간결과리턴
    answer = 0
    #다리위에 올릴 수 있는지 체크하기위한 변수
    waiting = 0

    index=0
    length = len(truck_weights)
    
    while waitTrucks:
        if len(goingTrucks) == bridge_length: #길이가 같다면 트럭이 다 지나갔기때문에 뺴주자.
            waiting-=goingTrucks.pop()
        
        nextTruck=waitTrucks.pop()
        if weight >= waiting+nextTruck: #다리위에 트럭을 놓을 수 있는가 비교한다
            #트럭을 다리위에 놓아준다
            waiting+=nextTruck
            goingTrucks.insert(0,nextTruck)
        else:
            #무게떄문에 트럭을 못놓는다면 시간만 지나간다.
            goingTrucks.insert(0,0)
            waitTrucks.append(nextTruck) #pop헀기떄문에트럭을 다시 대기열에 넣어줘야한다.
    
        answer += 1
        
    #대기열 트럭이 다 빠졌더라도 지나가고있는 트럭들의 시간도 세줘야 한다.
    #bridge_length의 길이만큼 지나가야 하기 때문에 bridge_length의 길이를 더해준다.
    if goingTrucks:
        answer += bridge_length
    return answer

 

여기서 중요한 점은 

1. 무게 때문에 트럭이 못지나 가도 goingTruck에 값을 넣어주어서 트럭이 지나간걸 확인할 수 있게끔 한 것이고

2. goingTruck의 길이와 다리의 길이가 같다면 트럭이 지나간것이므로 트럭을 다리위에서 빼주는 것이다.

3. 그리고 큐(waitTruck)가 빌때까지 while은 돌리는데 while이 빠져나갔더라도 트럭이 다리위에 지나갈 수 있으므로

   다리위에 트럭이 있는지 확인한후(goingTruck) 다리길이만큼 시간을 더해줘야 한다.

 

나두 다른분들 푼것을 조금 참조해서 풀었따.