728x90
https://www.acmicpc.net/problem/2217
문제
N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다.
하지만 여러 개의 로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다. k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다.
각 로프들에 대한 정보가 주어졌을 때, 이 로프들을 이용하여 들어올릴 수 있는 물체의 최대 중량을 구해내는 프로그램을 작성하시오. 모든 로프를 사용해야 할 필요는 없으며, 임의로 몇 개의 로프를 골라서 사용해도 된다.
풀이
해당 문제는 그리디 유형의 문제로 아래와 같이 풀이 할 수 있다.
1. 밧줄이 견딜수 있는 하중을 기준으로 오름차순 정렬을 한다.
2. 밧줄의 개수 만큼 반복문을 돌리되 해당 밧줄이 견딜수 있는 하중이 제일 작다는 가정 하에 최대 하중을 구한다.
3. 추출한 최대하중 값중에 제일 큰 값을 추출 한다.
코드
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
let [k, ...arr] = input.map(Number);
arr.sort((a, b) => a - b);
let rArr = [];
for (let i = 0; i < arr.length; i++) {
const result = k * arr[i];
rArr.push(result);
k--;
}
console.log(Math.max(...rArr));