본문 바로가기
  • 개발하는 곰돌이
Algorithm/BOJ

[Kotlin] 백준 1092 : 배

by 개발하는 곰돌이 2022. 12. 24.

문제 링크

 

1092번: 배

첫째 줄에 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 각 크레인의 무게 제한이 주어진다. 이 값은 1,000,000보다 작거나 같다. 셋째 줄에는 박스의 수 M이 주어진다. M은 10,000보

www.acmicpc.net



문제 해설

문제를 풀기 위해 먼저 크레인의 무게 제한과 박스의 무게를 내림차순으로 정렬한다. 가장 짧은 시간 내에 모든 박스를 배로 옮기기 위해선 아직 남아있는 상자 중에 각 크레인이 옮길 수 있는 가장 무거운 상자를 옮겨야 한다. 구현 과정은 다음과 같다.

  1. 크레인의 무게 제한과 박스의 무게를 내림차순으로 정렬한다.
  2. 크레인의 가장 큰 무게제한보다 무거운 상자가 있다면 즉시 -1을 출력하고 프로그램을 종료한다.
  3. 그 외의 경우에는 현재 옮겨야 할 박스의 무게와 크레인의 무게제한을 비교하여 아래의 동작을 수행한다.
    • 현재 크레인의 무게 제한이 박스 무게보다 크다면 박스를 옮기고 다음 크레인으로 이동한다.
    • 현재 크레인의 무게 제한이 박스 무게보다 작다면 다음 박스와 크레인의 무게 제한을 비교한다.
  4. 모든 크레인의 무게 제한을 박스의 무게와 비교하였다면 minutes 값을 1 증가시키고 다시 첫 크레인부터 비교하는 것을 반복한다.

반복문이 종료된 후에 minutes 값을 출력한다.


Code

import java.util.StringTokenizer

fun main() = with(System.`in`.bufferedReader()) {
    val n = readLine().toInt()
    val crains = StringTokenizer(readLine()).run { IntArray(n) { nextToken().toInt() }.sortedArrayDescending() }
    val m = readLine().toInt()
    val boxes = StringTokenizer(readLine()).run {
        val temp = ArrayList<Int>()
        repeat(m) { temp.add(nextToken().toInt()) }
        temp.sortDescending()
        temp
    }

    if (crains[0] < boxes[0]) {
        println(-1)
        return@with
    }

    var minutes = 0
    while (boxes.isNotEmpty()) {
        var boxIndex = 0
        var crainIndex = 0
        while (crainIndex < crains.size) {
            if (boxIndex == boxes.size) break
            if (crains[crainIndex] >= boxes[boxIndex]) {
                boxes.removeAt(boxIndex)
                crainIndex++
            } else {
                boxIndex++
            }
        }
        minutes++
    }

    println(minutes)
}

댓글