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

    • 예를 들어, 트럭 2대가 올라갈 수 있고 무게를 10kg까지 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.



    • 따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다.
    • solution 함수의 매개변수로 다리에 올라갈 수 있는 트럭 수 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭 별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.
  • 제한사항
    • bridge_length는 1 이상 10,000 이하입니다.
    • weight는 1 이상 10,000 이하입니다.
    • truck_weights의 길이는 1 이상 10,000 이하입니다.
    • 모든 트럭의 무게는 1 이상 weight 이하입니다.
  • 입출력 예

 

 

  • 문제 풀이 1
    • 문제를 보고 일단 테스트 코드에 나와 았는 부분으로 손로직 구상
    • [0 0 7 0 4 5 0 6], [0*100 10], [0*100 10 10 10 10 10 10 10 10 10 10]의 규칙이 이 보였다
    • 이를 통하여 코드 작성
    • 그런데 코드를 작성한 걸로 테스트 코드는 통과가 되나 테스트 1,4,5,6,8,9,10이 실패
    • 문제를 보니 직전 수만 비교하는 것을 확인
def solution(bridge_length, weight, truck_weights):
    answer = bridge_length
    temp = 0
    for truck in truck_weights:
        if temp == 0 or temp + truck <= weight:
            answer += 1
        else:
            answer += bridge_length
        temp = truck
        
    return answer

 

  • 문제 풀이 2
    • 위의 의 문제로 바로 더하기 값을 추가하는 방식으로 진행
    • 큐를 이용하여 초기에 전체 대기 시간을 주고 그것을 초단위로 계산하는 방식으로 구현
    • 다 통과 되었으나 테스트 5번에서 시간 초과로 실패
from collections import deque
def solution(bridge_length, weight, truck_weights):
    answer = 0
    queue = deque([0] * bridge_length)
    truck_weights = truck_weights[::-1]
    
    while queue:
        queue.popleft()
        if truck_weights and sum(queue) + truck_weights[-1] <= weight:
            queue.append(truck_weights[-1])
            truck_weights.pop()
        elif truck_weights:
            queue.append(0)
            
        answer += 1
    return answer

 

 

  • 문제 풀이 3
    • 위 코드에서 sum(queue) 부분에서 시간복잡도가 올라가서 그부분을 따로 컨트롤 할 수 있도록 구현
from collections import deque
def solution(bridge_length, weight, truck_weights):
    answer = 0
    queue = deque([0] * bridge_length)
    truck_weights = truck_weights[::-1]
    total = 0
    while queue:
        check = queue.popleft()
        if check > 0 :
            total -= check
            
        if truck_weights and total + truck_weights[-1] <= weight:
            queue.append(truck_weights[-1])
            total += truck_weights[-1]
            truck_weights.pop()
            
        elif truck_weights:
            queue.append(0)
            
        answer += 1
    return answer

'Python > Python 문제' 카테고리의 다른 글

가장 큰 수 1일 차  (0) 2024.07.12
가장 많이 받은 선물  (0) 2024.07.12
2개 이하로 다른 비트  (0) 2024.07.11
숫자 변환하기  (0) 2024.07.05
롤케이크 자르기  (1) 2024.07.03

+ Recent posts