자바 백준 11508번
실버 4
https://www.acmicpc.net/problem/11508
문제 보기
분류: 정렬, 그리디 알고리즘
문제 풀기
세 개씩 묶었을때 가장 작은 가격을 제외하고 지불하는 규칙에서 전체 최소 비용을 구하기 위해서는 가격을 정렬하여 제외시킨다.
가격이 정렬된 상태에서 세 개씩 묶을 수 있으면 그 중 가장 작은 가격을 제외하고 누적 합한다. 세 개씩 묶여지지 않은 나머지 가격인 두 개 또는 한 개의 가격은 그대로 합한다.
코드 보기
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 유제품 수 입력
int N = Integer.parseInt(br.readLine());
// 유제품 개수만큼 가격을 저장할 array 생성
int[] prices = new int[N];
// 유제품 가격 입력
for (int i = 0; i < N; i++) {
prices[i] = Integer.parseInt(br.readLine());
}
// 유제품 가격 오름차순 정렬
Arrays.sort(prices);
// 최소비용 계산하는 함수 이용
long totalCost = calculateTotalCost(prices, N);
// 결과 출력
System.out.println(totalCost);
}
// 최소비용을 계산하는 함수
private static long calculateTotalCost(int[] prices, int N) {
long totalCost = 0; // 최종 비용 초기화
// 유제품 가격 배열을 거꾸로 탐색하면서 최소비용을 계산
// 한 번의 루프에서 3개의 유제품을 처리
for (int i = N - 1; i >= 0; i -= 3) {
if (i == 0) {
// 세 개씩 묶고 남은 유제품이 1개인 경우, 해당 제품의 가격을 그대로 추가
totalCost += prices[i];
} else if (i == 1) {
// 세 개씩 묶고 남은 유제품이 2개인 경우, 두 제품의 가격을 더하여 추가
totalCost += prices[i] + prices[i - 1];
} else {
// 남은 유제품이 3개 이상인 경우, 가장 저렴한 제품 가격을 빼고 추가
totalCost += prices[i] + prices[i - 1];
}
}
return totalCost;
}
}
'공부하기 > 백준' 카테고리의 다른 글
[Java] 백준 풀기 6550 - 부분 문자열 (0) | 2023.08.18 |
---|---|
[Java] 백준 풀기 1213 - 팰린드롬 만들기 (0) | 2023.08.16 |
[Java] 백준 풀기 10610 - 30 (0) | 2023.08.14 |
[Java] 백준 풀기 10162 - 전자레인지 (0) | 2023.08.13 |
[Java] 백준 풀기 4597 - 패리티 (0) | 2023.08.12 |