본문 바로가기

Programmers

[Programmers] 다리를 지나는 트럭 - kotlin

다리를 지나는 트럭 (Level2)

link - https://programmers.co.kr/learn/courses/30/lessons/42583

 

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

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈

programmers.co.kr

 

1. 문제 파악하기

- 입력 : 다리 길이 / 다리 감당 가능한 무게 / 지나갈 트럭 리스트 

- 출력 : 트럭이 모두 다리를 지나갈때까지 걸리는 시간 출력

 

- 한 트럭이 다리를 지나갈때는 다리길이만큼의 시간이 소요된다.

- 대기중인 트럭의 무게가 더해졌을때 다리가 감당 가능한 무게를 초과한다면 대기중인 트럭은 올라갈수 없고 대기 

 

2. 아이디어

- Queue를 사용하여 현재 다리에 올라온 트럭들을 관리하자 

- Queue에는 Pair 형태의 데이터를 저장할텐데 <트럭의 무게, 현재 위치> 를 저장하자 

- go 라는 함수를 작성하는데 q의 트럭들을 한번씩 전진 시키며, 전진후 추가될수있는 길이와 무게를 반환한다 

- go 라는 함수를 실행시켜서 현재 대기중인 트럭을 추가시킬수 있으면 큐에 추가한다 

- 모든 트럭을 큐에 추가했으면 마지막으로 큐에 모든 트럭이 없어질때까지 실행시킨다 

- go 함수가 실행된 횟수가 정답이 된다 

 

3. 풀이

import java.util.*
class Solution {
    var q: Queue<Pair<Int, Int>> = LinkedList()
    var answer = 0
    fun solution(bridge_length: Int, weight: Int, truck_weights: IntArray): Int {
        answer = 0
        var con = true
        truck_weights.mapIndexed { i, inputV ->
            con = true
            while (con) {
                var p = go(bridge_length, weight)
                if(p.first > 0 && p.second >= inputV) {
                    q.add(Pair(inputV, 1))
                    con = false
                }
            }
        }
        while(!q.isEmpty()) {
            go(bridge_length, weight)
        }
        
        return answer
    }
    
    // 더 추가할수 있는 숫자, 무게 리텉
    fun go(len: Int, weight: Int): Pair<Int, Int>{
        var w = 0
        answer++
        for(i in 0 until q.size) {
            var front = q.poll()
            if (front != null && front.second != len) {
                q.add(Pair(front.first, front.second+1))
                w += front.first
            }
        }
        return Pair(len-q.size, weight-w)
    }
}
cs