문제 : boj11508
1. 어떻게 최소 비용을 만들 수 있을까?
어차피 중복해서 물건을 구매할 수 없고, 모든 물건을 구매해야 하므로 N개의 물건에 대해 'N/3(내림)'개의 물건만을 2+1 세일로 가격을 빼낼 수 있다. 이걸 변경할 방법이 없으므로, 결국 최대한 비싼 물건을 세일로 빼내는 것이 최소 비용을 만들 수 있는 방법이다.
이 때 특정 3개의 문제를 골랐을 때 이 중 가장 싼 물건의 가격이 빠지는 것이고, 이 '가장 싼 물건'이 최대한 비싼 물건일수록 이득이므로 결국 비싼 물건들부터 고르는 것 말고는 최소 비용을 만들 수 있는 방법이 없다. 즉, 문제 설명에서 나온 7개의 유제품 '10, 9, 4, 2, 6, 4, 3'을 봐보자. 문제에서는 위의 표처럼 그룹지었지만, 세일로 빠지는 가격을 늘리기 위해서는 아래의 표처럼 그룹지어야 한다. 이 경우 '9'만큼이나 세일받을 수 있다.
2. 로직
결국 입력으로 들어온 모든 유제품의 가격을 내림차순으로 정렬한 후, 3개씩 짝지어서 그 중 가장 싼 가격은 무시하면 된다.
A. 내림차순 정렬
B. 큰 가격부터 낮은 가격으로 순회하면서 가격들을 더한다. 이 때 3의 배수번째(?)에 있는 수는 합계에 더하지 않는다.
코드 : github
import java.io.DataInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
public class Main extends FastInput {
private void solution() throws Exception {
int n = nextInt();
ArrayList<Integer> arr = new ArrayList<>(n);
while (n-->0) arr.add(nextInt());
Collections.sort(arr, Collections.reverseOrder());
int sum = 0;
for(int i = 0; i < arr.size(); i++) {
if ((i+1)%3!=0)
sum+=arr.get(i);
}
System.out.println(sum);
}
public static void main(String[] args) throws Exception {
initFI();
new Main().solution();
}
}
class FastInput {
private static final int DEFAULT_BUFFER_SIZE = 1 << 16;
private static DataInputStream inputStream;
private static byte[] buffer;
private static int curIdx, maxIdx;
protected static void initFI() {
inputStream = new DataInputStream(System.in);
buffer = new byte[DEFAULT_BUFFER_SIZE];
curIdx = maxIdx = 0;
}
protected static int nextInt() throws IOException {
int ret = 0;
byte c = read();
while (c <= ' ') c = read();
do {
ret = ret * 10 + c - '0';
} while ((c = read()) >= '0' && c <= '9');
return ret;
}
private static byte read() throws IOException {
if (curIdx == maxIdx) {
maxIdx = inputStream.read(buffer, curIdx = 0, DEFAULT_BUFFER_SIZE);
if (maxIdx == -1) buffer[0] = -1;
}
return buffer[curIdx++];
}
}
'PS > BOJ' 카테고리의 다른 글
백준 16936 자바 - 나3곱2 (BOJ 16936 JAVA) (0) | 2022.02.23 |
---|---|
백준 10817 파이썬 - 세 수 (BOJ 10817 Python) (0) | 2022.02.23 |
백준 11468 자바 - Concatenation (BOJ 11468 JAVA) (0) | 2022.02.21 |
백준 16678 자바 - 모독 (BOJ 16678 JAVA) (0) | 2022.02.21 |
백준 18917 자바 - 수열과 쿼리 38 (BOJ 18917 JAVA) (0) | 2022.02.20 |
댓글