문제
접근법
문제만 이해하면 쉬운 문제다.
k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에 모두 고르게 w/k 만큼의 중량이 걸린다.
N은 이미 입력값으로 주어지고 있기 때문에, 출력값이 W라고 하면 W/N 만큼의 중량이 각 로프에 골고루 걸린다.
즉, N이 2이고, 10, 15가 로프의 가용중량으로 주어지면 2*10 = 20이 최대 중량이 되는 것이다.
∵ W/N = (각 로프의 가용 중량 중 최솟값) / W = (각 로프의 가용 중량 중 최솟값) * N
이때, 문제의 예외가 발생한다.
모든 로프를 사용해야 할 필요는 없으며, 임의로 몇 개의 로프를 골라서 사용해도 된다.
이 부분이다. 따라서, 우리는 항상 각 로프의 가용 중량 중 최솟값을 고르는게 아니라 최솟값부터 하나씩 없애보면서 로프가 버틸 수 있는 최대 중량을 구해야 하는 것이다.
예를 들어보자.
3 5 10 15가 주어진다고 하면, 10이 최솟값이므로 5 * 3 = 15을 최대 중량으로 구할 수 있다. 하지만 5를 포함하지 않아도 되므로 제거하고 구하면 10 * 2 = 20으로 더 커지는 것을 볼 수 있다. 15 * 1 = 15 보다 20이 더 크기 때문에 답은 20이 된다.
코드를 보면 이해가 빠를 것이다.
풀이
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
ArrayList<Integer> ropes = new ArrayList<>(N);
for (int i = 0; i < N; i++) {
ropes.add(Integer.parseInt(br.readLine()));
}
Collections.sort(ropes);
int W = 0;
for (Integer rope : ropes) {
W = Math.max(W, rope * N);
N--;
}
bw.write(String.valueOf(W));
bw.flush();
}
}
'알고리즘 > 그리디' 카테고리의 다른 글
[백준] 14916번: 거스름돈 자바(Java) (1) | 2025.01.11 |
---|---|
[백준] 13305번: 주유소 자바(Java) (0) | 2025.01.07 |
[백준] 1541번: 잃어버린 괄호 자바(Java) (2) | 2025.01.06 |
[백준] 11399번: ATM 자바(Java) (3) | 2024.12.31 |
[백준] 1018번: 보물 자바(Java) (1) | 2024.12.28 |