Better Code, Better Life

다리를 지나는 트럭 - 프로그래머스 - 파이썬 풀이 본문

Coding Test/Programmers

다리를 지나는 트럭 - 프로그래머스 - 파이썬 풀이

심재훈 2019. 7. 30. 17:00

문제 풀이

트럭이 진입할 때 걸리는 시간, 나갈 때 걸리는 시간이 헷갈리는 문제입니다.

예시 1번을 보면

0 ~ 2초에 건널 것 같은 트럭이 0 ~ 1초에는 진입하고, 1 ~ 3초까지 건넙니다.

이 점을 이해하고 문제를 풀어봅시다.

  1. 1초 단위로 업데이트를 합니다. 다리에 있는 트럭들 위치를 1만큼 이동시킵니다.
  2. 위치가 0이 된 트럭은 제거해줍니다.
  3. 만약 1, 2번 단계 이후에 weight_capacity 여유가 있다면 추가 시켜줍니다.
    1. [truck_weight, bridge_length]로 추가시킵니다.
    2. 추후에 다리 끝에 도달 했을 때 제거된 트럭 무게를 구할 수 있게 됩니다.

deque 자료구조를 통해 첫 번째 원소를 추출해내는 작업을 수월하게 할 수 있습니다.

프린터 문제 해설 에서 deque 설명을 참조하세요!

클린 코드 작성법

  1. Logic이 시작하기 전에 이 코드뭉치를 작성했는지 주석으로 작성해줍니다.
    1. 주석은 코드가 어떻게 돌아갔는지보다 이 로직을 작성하는지 설명해주어야 합니다.
    2. 주석은 정확해야 합니다. 주석과 코드의 내용이 다르다면 읽는 이는 큰 혼돈에 빠집니다...
    3. 주석을 쓸 시간이 없다면 대충 쓰는 것보다 안 쓰는 것이 좋습니다.
  2. while문 내에 for문, if문 중첩을 함수화로 해결합니다.
    1. update 함수는 복잡하기 때문에 직접 while문 내에 넣기보다 함수로 작성해줍시다.
  3. 문제에 제시된 weight 변수는 weight_capacity가 더 적절한 변수명입니다.
    1. 적절한 변수명을 지어 문제를 더 잘 이해해 봅시다.

해답 코드

from collections import deque

def update(weight_capacity, trucks_in_bridge):
    # Move all truck's location by 1
    for index, truck_info in enumerate(trucks_in_bridge):
        weight, location = truck_info
        trucks_in_bridge[index][1] = location - 1

    # Remove a truck if it passes the bridge.
    if trucks_in_bridge:
        first_truck_weight, first_truck_location = trucks_in_bridge[0]
        if first_truck_location == 0:
            weight_capacity += first_truck_weight
            trucks_in_bridge.popleft()
    return weight_capacity, trucks_in_bridge

def solution(bridge_length, weight, truck_weights):
    weight_capacity = weight
    truck_weights = deque(truck_weights)
    trucks_in_bridge = deque([])
    time_taken = 0

    # Send a truck in the queue if possible or wait for a second.
    while truck_weights:
        time_taken += 1
        weight_capacity, trucks_in_bridge = update(weight_capacity, trucks_in_bridge)
        if 0 <= weight_capacity - truck_weights[0]:
            truck_weight = truck_weights.popleft()
            trucks_in_bridge.append([truck_weight, bridge_length])
            weight_capacity -= truck_weight

    # Wait until last truck pass the bridge.
    if trucks_in_bridge:
        last_truck = trucks_in_bridge[-1]
        last_truck_location = last_truck[1]
        time_taken += last_truck_location
    return time_taken

도움이 됐다면 공감버튼을 눌러주세요! 질문이 있다면 댓글 달아주세요!

 

문제 링크

 

코딩테스트 연습 - 다리를 지나는 트럭 | 프로그래머스

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다. ※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다. 예를 들어, 길이가 2이고 10kg 무게를 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서

programmers.co.kr

 

Comments