Code in

프로그래머스 큐 다리를 지나는 트럭 with Kotlin 본문

알고리즘 스터디_문제풀이

프로그래머스 큐 다리를 지나는 트럭 with Kotlin

heyhmin 2020. 8. 11. 18:48

프로그래머스 큐, 다리를 지나는 트럭 문제입니다.

큐는 add 하는 곳과 poll(remove)하는 곳이 다르다는 것을 유의해야 했습니다...

 

IntelliJ에서의 문제 풀이입니다.

import java.util.Queue
import java.util.LinkedList
// Kotlin은 JVM: Java Virtual Machine 을 사용하기 때문에 Java의 Queue를 import합니다.
var bridge_length:Int = 2
var weight: Int = 10
var truck_weights: IntArray = intArrayOf(7, 4, 5, 6)
fun solution(bridge_length: Int, weight: Int, truck_weights: IntArray): Int {
    var answer = 0

    data class truck(val weight: Int, var current: Int)
    // truck이라는 이름의 weight, current를 가진 구조의 Data를 선언합니다.

    val bridge: Queue<truck> = LinkedList<truck>()
    // import한 Queue를 LinkedList를 통해 생성합니다.
    // 삽입 삭제가 많기 때문에 LickedList가 더 적합할 것 같습니다.
    var waitfront = 0 // 기다리고 있는 트럭(truck_weights)의 front Index입니다.
    var curweight = 0 // 현재 다리 위에 있는 트럭들의 무게 총 합입니다.

    while ( !bridge.isEmpty() || waitfront < truck_weights.size ){
        // 다리에 트럭이 있는 경우 or 기다리는 트럭이 있는 경우 실행합니다.

        if (waitfront < truck_weights.size && curweight + truck_weights[waitfront] <= weight){
            // 기다리는 트럭이 있고, 다음 트럭이 현재 다리 위의 무게에 더해져도 괜찮은 경우 실행합니다.
            curweight += truck_weights[waitfront]
            // Queue로 데이터가 들어가기 전, 무게를 더해줍니다.
            bridge.add(truck(truck_weights[waitfront++], 0))
            // Queue bridge에 truck을 추가해줍니다. offer로 대체 가능합니다.
            // offer는 용량 초과시 Exception이 아닌 false를 return 합니다.
        }

        bridge.forEach {it.current++} // bridge에 있는 모든 truck 요소들의 current를 1 더해줍니다.

        if (bridge.peek().current >= bridge_length) // 가장 앞의 트럭이 다리를 다 건넜다면
            curweight -= bridge.poll().weight // remove는 Queue가 비면 Exception throw해서 poll로 대체합니다.
        // poll로 가장 들어간지 오래된 데이터를 빼고 null을 넣으면서 빠져나온 데이터의 weight값을 사용합니다.

        answer++ // timer++ 라고 보면 됩니다.
    }
    answer++
    return answer
}
fun main() {
    print(solution(bridge_length, weight, truck_weights)) // 8
}

 

URL: https://programmers.co.kr/learn/courses/30/lessons/42583?language=kotlin

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이��

programmers.co.kr

 

Comments