Uknow's Lab.
article thumbnail

https://www.acmicpc.net/problem/2217

 

2217번: 로프

N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하

www.acmicpc.net

 

난이도 : 실버 4
태그 : 수학, 그리디, 정렬

 

 

설명

n개의 로프가 주어지고, k개의 로프로 w만큼의 물체를 들어올릴때, 각 로프에는 w/k의 부하가 걸립니다.

10를 버틸 수 있는 로프 하나, 15를 버틸 수 있는 로프 하나가 있으면

15개 하나를 사용하는 것 보다는, 10만큼씩 2개를 사용해 20의 무게를 들어올리는게 더 효율적입니다.

 

각각 5, 10, 15, 20, 25를 들어올릴 수 있는 로프가 한 개씩 있다고 가정하면,

5 * 5 = 25

10 * 4 = 20

15 * 3 = 45

20 * 2 = 40

25 * 1 = 25

15만큼 중량으로 3개를 사용하는게 가장 효율적입니다.

구하는 방법은 숫자를  정렬하고,

현재 무게 * (로프 개수 - 지금 로프의 idx)를 하면 됩니다.

 

 

 

소스코드

import kotlin.math.max

fun main() = with(System.`in`.bufferedReader()) {

    val n = readLine().toInt()
    val arr = Array(n) { 0 }
    for (i in 0 until n) {
        arr[i] = readLine().toInt()
    }

    arr.sort()
    var max = arr[0] * n

    for (i in 0 until n) {
        max = max(max, arr[i] * (n - i))
    }

    println(max)
}

 

 

후기

정렬 + 그리디 알고리즘으로 풀 수 있었던 문제였습니다.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.