https://www.acmicpc.net/problem/2217
코드설명
그리디 알고리즘입니다.
우선 오름차순으로 정렬합니다.
여기서 array.sort로 오름차순 정렬을 하는 이유에 궁금증이 듭니다.
이유는, 최대한 적은 무게를 들 수 있는 무게를 나중에 배치함으로써 들 수 있는 무게를 최대한으로 하기 위함입니다.
로프가 최대한 많을때 가장 작은 수를 들 수 있도록 해야 최대값을 구할 수 있습니다.
예시로
1, 2, 3, 4 5 가 있다고 가정합니다.
이떄, 위의 로프들로 가장 많이 들 수 있는 무게를 구해보겠습니다.
일단 5가 max값이므로 5부터 시작하겠습니다.
5일떄는, 로프가 1개이므로 ( 5 * 1 ) 로 5만큼 들 수 있습니다.
4일때는, 로프가 2개이므로 ( 4 * 2 ) 8만큼 들 수 있습니다.
3일때는, 로프가 3개이므로 ( 3 * 3 ) 9만큼 들 수 있습니다.
2일때는, 로프가 4개이므로 ( 2 * 4 ) 8만큼 들 수 있습니다.
1일때는, 로프가 5개이므로 ( 1* 5 ) 5만큼 들 수 있습니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static int N;
public static int[] arr;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
arr = new int[N];
for(int i=0;i<N;i++) {
st = new StringTokenizer(br.readLine());
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int max = arr[N-1];
for(int i = N-1; i >= 0;i--) {
arr[i] = arr[i] * (N - i);
if(max < arr[i]) max = arr[i];
}
System.out.println(max);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 11508 2+1 세일 - 그리디 + 정렬 JAVA (0) | 2023.07.21 |
---|---|
[백준] 1758 알바생 강호 - 그리디 + 정렬 JAVA (0) | 2023.07.20 |
[백준] 1343 폴리오미노 - 그리디 + 구현 JAVA (0) | 2023.07.20 |
[백준] 14916 거스름돈 - DP JAVA (0) | 2023.07.20 |
[백준] 1789 수들의 합 - 수학 JAVA (0) | 2023.07.19 |