
-Code
import java.io.*;
import java.util.*;
public class BOJ16501 {
static boolean[] visited = new boolean[8];
static double[] teamScore = new double[8];
static double[] tempTeam = new double[8];
static double answer = 0;
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// 팀 실력 점수 받기
for (int i = 0; i < 8; i++) {
teamScore[i] = Double.parseDouble(st.nextToken());
}
// 백트래킹으로 모든 경우의 수 계산
backtracking(0);
// 소수점 계산
String answerStr = String.format("%.2f", answer);
if (answerStr.charAt(answerStr.length() - 1) == '0') {
answerStr = answerStr.substring(0, answerStr.length() - 1);
}
System.out.println(answerStr);
}
private static void backtracking(int depth) {
if (depth == 8) {
// 각 팀의 평균 계산
double team1 = (tempTeam[0] + tempTeam[1]) / 2.0;
double team2 = (tempTeam[2] + tempTeam[3]) / 2.0;
double team3 = (tempTeam[4] + tempTeam[5]) / 2.0;
double team4 = (tempTeam[6] + tempTeam[7]) / 2.0;
// 만족도 계산
double happy1 = 1 - (Math.abs(team1 - team2) / 10.0);
double happy2 = 1 - (Math.abs(team3 - team4) / 10.0);
// 현재 최대 만족도 계산
answer = Math.max(answer, Math.min(happy1, happy2));
return;
}
for (int i = 0; i < 8; i++) {
if (!visited[i]) {
visited[i] = true;
tempTeam[depth] = teamScore[i];
backtracking(depth + 1);
visited[i] = false;
}
}
}
}
처음에 그리디로 접근을 했으나 틀린 접근이었습니다. 그래서 뭐가 잘못됐는지 찾아보니 하나하나 모든 조합을 찾아보는 문제라서 백트래킹을 이용해야 했습니다. 완벽하게 풀지 못해서 내일 다시 한번 풀어볼 예정입니다.
'Beakjoon&프로그래머스 > Java' 카테고리의 다른 글
| [프로그래머스/Java] [3차] n진수 게임 (0) | 2026.04.01 |
|---|---|
| [백준/Java] 2493번 탑 (0) | 2026.03.31 |
| [프로그래머스/Java] [3차] 압축 (0) | 2026.03.30 |
| [프로그래머스/Java] 뒤에 있는 큰 수 찾기 (0) | 2026.03.30 |
| [백준/Java] 31519번 A Cappella Recording (0) | 2026.03.30 |