다리를 지나는 트럭 (Programmers 42583)

문파이더맨·2021년 4월 29일
0

Algorithm

목록 보기
6/58
post-thumbnail

🧑‍💻 문제

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

🧑‍💻 해결방법

  • 스택, 큐에 대한 이해가 있다면 바로 큐 문제일 것을 예상할 수 있다.
  • 파이썬스러운 사고를 기르기 위해서 바로 큐 라이브러리를 사용하려했으나 굳이 그럴 필요가 없을 느끼고 리스트를 건드리는 방식을 선택했다.

🧑‍💻 코드

def solution(bridge_length, weight, truck_weights):
    count_time = 0
    queue = [0 for i in range(bridge_length)]

    while queue:
        # 시간은 어차피 흘러야 함
        count_time += 1
        # 다리를 지나면 queue 리스트에선 사라지기 때문에 pop(0)을 해준다.
        queue.pop(0)
        # truck_weights에도 pop을 가하기 때문에 존재여부를 묻는다.
        if truck_weights:
            # truck_weights[0]은 대기열의 첫번째를 위해서!
            if sum(queue) + truck_weights[0] <= weight:
                queue.append(truck_weights.pop(0))
            else:
                queue.append(0)

    return count_time

🧑‍💻 총평

  • 파이썬스러운 사고가 늘었다! (비록 여기선 사용하지 않았으나...)
  • pop() 과 pop(0)의 차이 : 전자는 뒤를 pop, 후자는 앞을 pop
  • 리스트에 반복문을 사용해서 초기화하는 것은 이제 C를 이용하던 것만큼 익숙해졌다.
  • 허나 갈 길이 구만리ㅠㅠ..
profile
Sever 개발할래요.

0개의 댓글