자바 백준 20115번
실버 3
https://www.acmicpc.net/problem/20115
문제 보기
분류: 그리디 알고리즘
문제 풀기
두 개의 드링크를 비교하여 합칠 때 많은 양을 반으로 나누어 합치게 되면 초기 많은 양의 캔 보다 작아진다. 따라서 모든 두 비교 대상에 대해 적은 양 만을 선택해 합쳐야 한다. 즉, 모든 드링크에서 가장 많은 것만 온전히 합치고 나머지들은 반으로 나누어 합치는 모습이 되므로 정렬을 한 후 최댓값 그리고 나머지로 분리하여 계산 및 출력한다.
코드 보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Arrays;
// 주어진 숫자 배열에서 최댓값을 제외한 나머지 숫자의 합을 계산하는 클래스
class DrinkCalculator {
public static double calculateMaxDrink(long[] drinks) {
// 숫자 배열을 정렬
Arrays.sort(drinks);
int n = drinks.length;
// 최댓값을 찾음
long max = drinks[n - 1];
// 최댓값을 제외한 나머지 숫자들의 합을 계산
double sum = Arrays.stream(drinks).limit(n - 1).sum();
// 최댓값과 나머지 숫자들의 합을 2로 나누고 최댓값을 더하여 결과를 반환
return max + (sum / 2);
}
}
public class Main {
public static void main(String[] args) throws IOException {
// 입력을 받기 위한 BufferedReader와 StringTokenizer를 초기화
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// 숫자의 개수 N을 읽어옴
int n = Integer.parseInt(st.nextToken());
// 숫자들을 저장할 배열을 생성
long[] drinks = new long[n];
// 숫자들을 읽어와 배열에 저장
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
drinks[i] = Long.parseLong(st.nextToken());
}
// DrinkCalculator 클래스를 사용하여 최댓값을 계산하고 결과를 출력
double result = DrinkCalculator.calculateMaxDrink(drinks);
System.out.println(result);
}
}
'공부하기 > 백준' 카테고리의 다른 글
[Java] 백준 풀기 1526 - 가장 큰 금민수 (0) | 2023.09.20 |
---|---|
[Java] 백준 풀기 1977 - 완전 제곱수 (0) | 2023.09.19 |
[Java] 백준 풀기 11256 - 사탕 (0) | 2023.09.12 |
[Java] 백준 풀기 28014 - 첨탑 밀어서 부수기 (0) | 2023.09.11 |
[Java] 백준 풀기 5338 - 마이크로소프트 로고 (0) | 2023.09.10 |