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)
}
후기
정렬 + 그리디 알고리즘으로 풀 수 있었던 문제였습니다.
'코딩테스트 > Kotlin' 카테고리의 다른 글
[백준 3273번] [Kotlin] 두 수의 합 (0) | 2023.02.04 |
---|---|
[백준 5585번] [Kotlin] 거스름돈 (0) | 2023.02.04 |
[백준 1912번] [Kotlin] 연속합 (0) | 2023.02.04 |
[백준 6603번] [Kotlin] 로또 (0) | 2023.02.04 |
[백준 1707번] [Kotlin] 이분 그래프 (0) | 2023.02.03 |