알고리즘(백준 등) 공부

SWEA 18799. 평균의 평균

posite 2026. 4. 29. 12:00

주어진 서로 다른 n개의 정수로 구성된 집합에 대해서 공집합이 아닌 부분집합의 평균의 평균을 구하는 문제이다.

 

n<=8 로 충분히 작기 때문에 백트래킹을 수행하면서 공집합이 아닐 때, 현재 합 / 길이 를 계산 후 저장한다.

private static void backtracking(List<Double> list, int[] numbers, int sum, int count, int start) {
    if(count != 0) {
        list.add((double)sum /count);
    }
    for(int i=start; i<numbers.length; i++) {
        backtracking(list, numbers, sum+numbers[i], count+1, i+1);
    }
}

 

 

백트래킹 수행 후 나온 평균들의 평균을 출력하면 된다.

List<Double> list = new ArrayList<>();
backtracking(list, numbers, 0, 0, 0);
double sum = 0;
for(double average: list) sum += average;
sb.append(sum / list.size()).append('\n');

 

 

결과 코드는 다음과 같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();

        for (int tc = 1; tc <= T; tc++) {
            sb.append('#').append(tc).append(' ');
            int n = Integer.parseInt(br.readLine());
            StringTokenizer st = new StringTokenizer(br.readLine());
            int[] numbers = new int[n];
            for(int i=0; i<n; i++) numbers[i] = Integer.parseInt(st.nextToken());
            List<Double> list = new ArrayList<>();
            backtracking(list, numbers, 0, 0, 0);
            double sum = 0;
            for(double average: list) sum += average;
            sb.append(sum / list.size()).append('\n');
        }
        
        br.close();
        System.out.print(sb);
    }
    
    private static void backtracking(List<Double> list, int[] numbers, int sum, int count, int start) {
        if(count != 0) {
            list.add((double)sum /count);
        }
        for(int i=start; i<numbers.length; i++) {
            backtracking(list, numbers, sum+numbers[i], count+1, i+1);
        }
    }
}