호기심 많은 분석가

[프로그래머스] 스택_큐 - 다리를 지나는 트럭 본문

Coding/Coding Test & Algorithm

[프로그래머스] 스택_큐 - 다리를 지나는 트럭

DA Hun 2021. 6. 24. 23:30
 

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

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈

programmers.co.kr

def solution(bridge_length, weight, truck_weights):
    gone = []
    going = []
    ready = truck_weights.copy()
    answer = 1
    go_tm = 1
    while truck_weights : 
        if len(going)!=0 and going[0][1] == bridge_length :
            gone.append(going.pop(0))
            if len(gone) == len(truck_weights) :
                break
        if len(going) <= bridge_length :
            if len(going)==0 :
                going.append([ready.pop(0), go_tm])
            else :
                going = [[i[0], i[1]+1] for i in going]   
                if len(ready)!=0 and sum(list(zip(*going))[0])+ready[0]<=weight :
                    going.append([ready.pop(0), go_tm])
        else :
            going = [[i[0], i[1]+1] for i in going]
        answer += 1
    return answer

내 풀이

 굉장히 오랜 시간을 들여 풀고도 마음에 들지 않는 문제였다. 일단 기본적으로 if 문으로 모든 경우의 수를 나눈 것도 문제였고, 쌈빡한 풀이 방법도 떠오르지 않았다.

 문제가 원했던, 다리에 올라갈 수 있는 트럭수, 다리가 견딜 수 있는 무게 등을 조건으로 주고 1초에 1씩 움직이므로 다리의 길이와 비교해주었다. 

다른 풀이

def solution(bridge_length,weight,truck_weights):
    answer = 0
    bridge_on = [0]* bridge_length
    curr_weight = 0
    
    while truck_weights:
        answer+=1
        bridge_out = bridge_on.pop(0)
        curr_weight -= bridge_out

        if curr_weight + truck_weights[0] > weight:
            bridge_on.append(0)
        else:
            truck = truck_weights.pop(0)
            bridge_on.append(truck)
            curr_weight += truck


    while curr_weight>0:
        answer +=1
        bridge_out = bridge_on.pop(0)
        curr_weight -=bridge_out

    return answer
    
# 출처 https://assaeunji.github.io/python/2020-05-08-pgtruck/

 이 풀이는 꽤 발상이 뛰어나다. 1초에 1씩 이동한다고 했으므로 그것을 다른 변수로 나타내기보다 0을 추가해주면서 그 부분을 해결했다. 읽으면서 신기하다고 느꼈지만 이런 발상을 실제로 문제를 만났을 때 할 자신이 조금 부족하여 내 코드를 보완하는 방향으로 나아가야겠다.