Development

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

코딩테스트/Python

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

yo~og 2021. 8. 3. 15:41
반응형

휴 드디어 풀었다!!!!! 코드가 많이., 더러운거같다 ㅠ.ㅠ 내 코드 설명하고 빨리 다른사람꺼 분석해봐야징...

 

내 코드

def solution(bridge_length, weight, truck_weights):
    from collections import deque

    crossing_truck = deque([])
    
    cnt=0
    i=0
    
    while True:
        if i==len(truck_weights) and len(crossing_truck)==0:
            break
        if len(crossing_truck) !=0:
            if crossing_truck[0][1] == bridge_length:
                crossing_truck.popleft()
        
        if i!=len(truck_weights):
            if weight>= (truck_weights[i] + sum([a[0] for a in crossing_truck])):
                crossing_truck.append([truck_weights[i],0])
                i+=1
        cnt+=1
        crossing_truck = deque([[i[0],i[1]+1] for i in crossing_truck])

    return cnt

다리를 건너는 트럭은 큐로, 대기 트럭은 i로 접근하였다. 다리를 건너는 트럭은 crossing_truck이라는 deque를 만들어서 풀었다. crossing_truck는 [[4,1],[1,2]] 이런식으로 crossing_truck[i][0]은 무게, crossing_truck[i][1]은 다리를 건넌 시간으로 만들었다.

 

1. i가 truck_weight의 길이와 같거나 다리를 건너는 트럭이 아무것도 없을 경우 break를 해준다. 여기서 바로 return cnt를 해줘도 된다!

2. 다리를 건너는 트럭의 길이가 0이 아니고 crossing_truck[0][1](다리를 건넌 시간)이 다리 길이와 같다면 crossing_truck.popleft()해준다.

3. i가 대기트럭의 길이보다 작고 그 다음 건너는 트럭무게와 지금 건너고 있는 트럭들의 무게의 합이 다리가 견디는 최대무게보다 작으면 다음 트럭을 crossing_truck에 추가해준다. 

4. cnt(시간)을 1을 더해주고 crossing_truck에서 시간도 +1해준다.

5. break문에 걸릴때까지 반복한다.

 

다른사람 코드

def solution(bridge_length, weight, truck_weights):
    time = 0
    bridge = [0] * bridge_length
    
    while len(bridge) != 0:
        time += 1
        bridge.pop(0)
        if truck_weights:
            if sum(bridge) + truck_weights[0] <= weight:
                bridge.append(truck_weights.pop(0))
            else:
                bridge.append(0)
        
    return time

bridge를 현재 다리 길이만큼 0으로 초기화 시킨다.

트럭이 다리를 건널 때 마다 [0,7] -> [7,0] -> [0,4] ->[4,5]... 이런식으로 다리가 버틸 수 있는 무게를 확인하고 pop, append 한다. 무게가 초과될경우는 0을 append시킨다.

 

반응형
Comments