공부하기/백준

[Java] 백준 풀기 20115 - 에너지 드링크

XEV 2023. 9. 13. 23:43

자바 백준 20115번

실버 3

https://www.acmicpc.net/problem/20115

 

20115번: 에너지 드링크

페인은 에너지 드링크를 좋아하는 회사원이다. 에너지 드링크는 카페인, 아르기닌, 타우린, 나이아신 등의 성분이 들어있어 피로 회복에 도움을 주는 에너지 보충 음료수이다. 야근을 마치고 한

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 그리디 알고리즘

 

 

 

 

 

문제 풀기

두 개의 드링크를 비교하여 합칠 때 많은 양을 반으로 나누어 합치게 되면 초기 많은 양의 캔 보다 작아진다. 따라서 모든 두 비교 대상에 대해 적은 양 만을 선택해 합쳐야 한다. 즉, 모든 드링크에서 가장 많은 것만 온전히 합치고 나머지들은 반으로 나누어 합치는 모습이 되므로 정렬을 한 후 최댓값 그리고 나머지로 분리하여 계산 및 출력한다.

 

 

 

 

 

코드 보기

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);
    }
}