[프로그래머스] 2단계_다리를 지나는 트럭 (python)

juyeon·2022년 7월 5일
0

코딩테스트(python)

목록 보기
14/22

문제

나의 풀이

1. 테스트 케이스 1/3개 맞음.........ㅠ

from collections import deque

def solution(bridge_length, weight, truck_weights):
    answer = 0
    ing = deque() #다리 위의 트럭
    after = [] #다리를 건넌 트럭
    truck_weights = deque(truck_weights)
    count = 0
    
    while True:
    	#다리 길이만큼 트럭이 다리 위에 머물렀을 때(즉 다 지나갔을 때)
        if count == bridge_length:
        	#다리를 다 건넘
            after.append(ing.popleft())
            #카운트 초기화
            count = 0
            
        #대기 트럭이 존재할 때
        if truck_weights:
        	#다리 위에 올라갈 조건을 충족할 때
            if truck_weights[0] + sum(ing) <= weight and len(ing) < bridge_length:
            	#다리 위에 트럭 올리고, 대기 트럭 삭제
                ing.append(truck_weights.popleft())
                #시간 증가하고, 카운트도 증가
                answer += 1
                count += 1
                
            #다리 위에 못 올라갈 때
            else:
                answer += 1
                count += 1
         
        #대기트럭도 다리 위의 트럭도 없을 때       
        elif not ing:
            answer += 1
            break
            
        #대기트럭은 없지만 다리 위의 트럭은 있을 때
        else:
            answer += 1
            count += 1
        
    return answer

2. 다른 사람 풀이 참고해서 품

def solution(bridge_length, weight, truck_weights):
    answer = 0
    bridge = [0] * bridge_length #다리 길이 정의
    
    while bridge:
        bridge.pop(0) #다리 위에서 한 칸씩 이동
        answer += 1 #시간 증가
        
        if truck_weights: #대기 차가 있을 때
        	#다리 위에 올라갈 수 있는 무게일 때
            if truck_weights[0] + sum(bridge) <= weight:
            	#다리 위에 차 올라감
                bridge.append(truck_weights.pop(0))
        
            else:
            	#다리 위에 아무것도 안 올라감(= 0)
                bridge.append(0)
            
    return answer

3. 2번이 짧지만, 시간 복잡도가 크므로 이를 낮춘 버전!

def solution(bridge_length, weight, truck_weights):
    answer = 0
    bridge = [0] * bridge_length
    total_weight = 0
    
    while bridge:
        total_weight -= bridge.pop(0)
        answer += 1
        
        if truck_weights:
            if total_weight + truck_weights[0] <= weight:
                total_weight += truck_weights[0]
                bridge.append(truck_weights.pop(0))
        
            else:
                bridge.append(0)
            
    return answer

: total_weight가 핵심!!
매번 다리 위에서 한칸 전진하고, 전진한 만큼 총 무게에서 빼준다.
그리고 대기 차에서 다리 위에 차를 추가할 때, 총 무게를 재조정!

profile
내 인생의 주연

0개의 댓글