공부하기/백준

[Java] 백준 풀기 15954 - 인형들

XEV 2024. 4. 20. 22:28

자바 백준 15954번

실버 1

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

 

15954번: 인형들

첫 번째부터 세 번째까지의 인형을 선택하면 표준편차는 2/3의 양의 제곱근이 되고, 이 때 표준편차가 최소가 된다. 두 번째부터 네 번째까지의 인형을 선택하는 경우와, 세 번째부터 다섯 번째

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 수학, 브루트포스 알고리즘, 임의 정밀도, 큰 수 연산

 

 

 

 

 

코드 풀이

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        // 인형의 개수 N과 선택할 인형의 개수 K 입력
        int N = sc.nextInt();
        int K = sc.nextInt();
        
        // 인형을 선호하는 사람의 수를 저장할 배열 생성 및 입력
        int[] dolls = new int[N];
        for (int i = 0; i < N; i++) {
            dolls[i] = sc.nextInt();
        }
        
        // 최소 표준 편차를 구하는 메서드 호출
        double minStdDev = findMinStdDev(dolls, K);
        
        // 결과 출력
        System.out.printf("%.11f\n", minStdDev);
    }
    
    // 최소 표준 편차를 구하는 메서드
    private static double findMinStdDev(int[] dolls, int K) {
        // 초기 최소 표준 편차를 Double 형의 최대값으로 설정
        double minStdDev = Double.MAX_VALUE;
        
        // 연속된 K개의 위치에 대해 모든 가능한 경우를 확인
        for (int i = K; i <= dolls.length; i++) {
            for (int j = 0; j <= dolls.length - i; j++) {
                // 현재 위치에서 K개의 인형을 선택하여 평균과 표준 편차를 계산
                double m = mean(dolls, j, i);
                double ret = standardDeviation(dolls, m, j, i);
                // 최소 표준 편차 갱신
                minStdDev = Math.min(minStdDev, ret);
            }
        }
        
        // 최소 표준 편차 반환
        return minStdDev;
    }
    
    // 평균을 구하는 메서드
    private static double mean(int[] arr, int start, int K) {
        double sum = 0.0;
        // 선택된 인형들의 선호하는 사람의 수를 합산
        for (int i = 0; i < K; i++) {
            sum += arr[start + i];
        }
        
        // 평균 반환
        return sum / K;
    }
    
    // 표준 편차를 구하는 메서드
    private static double standardDeviation(int[] arr, double m, int start, int K) {
        double sum = 0.0;
        // 각 인형의 선호하는 사람의 수와 평균의 차이의 제곱을 합산
        for (int i = 0; i < K; i++) {
            sum += Math.pow(arr[start + i] - m, 2);
        }
        
        // 분산 계산 후 제곱근을 취하여 표준 편차 반환
        return Math.sqrt(sum / K);
    }
}