주어진 서로 다른 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);
}
}
}'알고리즘(백준 등) 공부' 카테고리의 다른 글
| SWEA 17937. 큰 수의 최대공약수 (0) | 2026.04.30 |
|---|---|
| SWEA 18662. 등차수열 만들기 (0) | 2026.04.29 |
| SWEA 19003. 팰린드롬 문제 (0) | 2026.04.28 |
| SWEA 19004. 점프 놀이 (0) | 2026.04.28 |
| SWEA 19113. 식료품 가게 (0) | 2026.04.27 |