개발자 톡

연습문제 톡 루돌프 월드컵

java 정답코드 - 확률값 변수 타입 유의

등록일
2025-01-29 17:01:17
조회수
178
작성자
tjsqls2067
import java.io.*;
import java.util.*;


public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);


        int[] powers = new int[4];
        for(int i = 0; i < 4; i++){
            powers[i] = sc.nextInt();
        }


        // 1. 전체 승패에 대한 모든 경우 생성
        // [(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)]
        int[][] battleArr = {{0,1},{0,2},{0,3},{1,2},{1,3},{2,3}};
        LinkedList<String> battleStack = new LinkedList<>();
        ArrayList<String[]> battleResultArr = new ArrayList<>();
        battle(battleStack, battleResultArr);


        double probSum = 0.0d;
        
        // 2. 각 조합에서의 각각의 루돌프 승점 계산
        for(String[] resultArr : battleResultArr){
            
            int[] points = new int[4];
            double probSumTmp = 1.0d;


            for(int idx = 0; idx < resultArr.length; idx++){
                String rst = resultArr[idx];
                int i = battleArr[idx][0];
                int j = battleArr[idx][1];


                if("W".equals(rst)){
                    points[i] += 3;
                    probSumTmp *= winProbability(powers[i],powers[j]);
                }else if("L".equals(rst)){
                    points[j] += 3;
                    probSumTmp *= loseProbability(powers[i],powers[j]);
                }else if("S".equals(rst)){
                    points[i] += 1;
                    points[j] += 1;
                    probSumTmp *= sameProbability(powers[i],powers[j]);
                }
            }


            int biggerThan1st = 0;
            for(int idx = 1; idx < 4; idx++){
                if(points[0] < points[idx]) biggerThan1st++;
            }


            if(biggerThan1st <= 1){
                // 3. 확률 합산
                probSum += probSumTmp;
            }
        }


        System.out.println(probSum * 100);
        System.out.printf("%.3f",Math.round(probSum * 100 * 1000) / 1000.0d);
        
    }


    private static void battle(LinkedList<String> battleStack, ArrayList<String[]> battleResultArr){
        if(battleStack.size() == 6){
            battleResultArr.add(battleStack.toArray(new String[0]));
            return;
        }


        String[] result = {"W","L","S"};


        for(String rst : result){
            battleStack.push(rst);
            battle(battleStack, battleResultArr);
            battleStack.pop();
        }
    }


    private static double winProbability(int Fi, int Fj){
        return 4.0 * Fi / (5 * Fi + 5 * Fj);
    }


    private static double loseProbability(int Fi, int Fj){
        return 4.0 * Fj / (5 * Fi + 5 * Fj);
    }


    private static double sameProbability(int Fi, int Fj){
        return (Fi + Fj) / (5.0 * Fi + 5.0 * Fj);
    }
}


#루돌프_월드컵

이 카테고리의 톡 더보기