[백준]_14613_너의 티어는

` 구현 문제…? 더 깔끔한 방법이 있을 것 같지만 잘 생각나지 않아 일일이 계산하는 방식을 택함…

  1. for문 3개를 써서 win + lose + draw 가 20일 때 조건 만족
  2. 확률과 경우의 수 계산
    • 확률 : $ W^{win} * L^{lose} * D^{draw} $
    • 경우의 수 : $ 20! \over (win! * lose! * draw!) $

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class B14613 {
	static double W,L,D;
	static double[] arr = new double[5];
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st = new StringTokenizer(br.readLine());
		W = Double.parseDouble(st.nextToken());
		L = Double.parseDouble(st.nextToken());
		D = Double.parseDouble(st.nextToken());
		
		
		for (int win = 0; win <= 20; win++){
			for (int lose = 0; lose <= 20; lose++){
				for (int draw = 0; draw <= 20; draw++){
					
					if (win + lose + draw == 20){
						int score = 2000 + win * 50 - lose * 50;
						double pro = Math.pow(W, win * 1.0) * Math.pow(L, lose * 1.0) * Math.pow(D, draw * 1.0) * factorial(20)
							/ factorial(win) / factorial(draw) / factorial(lose);
						
						if (score >= 1000 && score <= 1499){
							arr[0] += pro;
						}else if (score >= 1500 && score <= 1999){
							arr[1] += pro;
						}else if (score >= 2000 && score <= 2499){
							arr[2]+= pro;
						}else if (score >= 2500 && score <= 2999){
							arr[3] += pro;
						}else if (score >= 3000 && score <= 3499){
							arr[4] += pro;
						}
					}
				}
			}
		}
		
		for(double x : arr) {
			sb.append(String.format("%.8f", x)).append("\n");
		}
		System.out.println(sb);
		
	}
	private static double factorial(int x)
	{
		if (x<=1) return 1.0;
		return x*factorial(x-1);
	}
}
updatedupdated2021-03-012021-03-01
Load Comments?