본문 바로가기
코딩테스트 준비(kotlin)/자료구조

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

by 1chanhue1 2024. 7. 9.

fun solution(bridge_length: Int, weight: Int, truck_weights: IntArray): Int {
    var answer = 0
    val truckQueue: Queue<Int> = LinkedList()
    val bridge: Queue<Int> = LinkedList()

    // 초기 다리는 빈 공간으로 채웁니다.
    for (i in 0 until bridge_length) {
        bridge.add(0)
    }

    // truck_weights 배열의 트럭을 truckQueue에 추가
    for (i in truck_weights.indices) {
        truckQueue.add(truck_weights[i])
    }

    var current_weight = 0

    while (bridge.isNotEmpty()) {
        answer++

        // 다리를 지난 트럭의 무게를 현재 무게에서 뺍니다.
        current_weight -= bridge.poll()

        // 대기 중인 트럭이 있는 경우
        if (truckQueue.isNotEmpty()) {
            // 현재 다리 위의 트럭들의 무게와 다음 트럭의 무게 합이 다리의 최대 하중을 넘지 않는 경우
            if (weight >= current_weight + truckQueue.peek()) {
                val truck = truckQueue.poll()  // 다음 트럭을 대기열에서 꺼냅니다.
                bridge.add(truck)  // 다리에 트럭을 추가합니다.
                current_weight += truck  // 현재 다리 위의 트럭 무게를 갱신합니다.
            } else {
                bridge.add(0)  // 트럭이 올라가지 못하면 빈 공간을 추가합니다.
            }
        }
    }

    return answer
}

 

문제해결 POINT

 

  • 현재 다리 위의 트럭들을 큐(Queue)로 관리한다.
  • 다리를 건너는 트럭의 위치를 트래킹하여 시간이 지남에 따라 위치를 업데이트한다.
  • 각 시간마다 새로운 트럭이 다리에 올라갈 수 있는지 체크하고, 다리에 올라갈 수 있다면 트럭을 큐에 추가한다.
  • 트럭이 다리를 완전히 건너면 큐에서 제거한다.