키워드
그의 랭크 점수는 현재 2000점이며, 그는 오늘 랭크게임을 20번 할 예정이다.
게임을 이길 경우 얻는 포인트는 50 Point, 질 경우 잃는 포인트도 50 Point, 비길 경우 Point의 변화는 없다.
- 브론즈: 1000~1499
- 실버: 1500~1999
- 골드: 2000~2499
- 플래티넘: 2500~2999
- 다이아: 3000~3499
구현
랭크 점수는 2000이지만 배열 크기의 압축을 위해 1000점씩 깎아서 계산했다.
- 점수에 따른 티어를 분류해주는 메소드
- DP
- cache는 2차원 배열을 선언한다
- [i]번 경기를 했을 때 [j]점일 확률을 저장한다.
- [0][1000] = 1을 저장한다.
- [i]번 경기를 했을 때 [j]점일 확률은 다음 확률을 전부 더하면 된다.
- [i-1]점 경기했을 때 [j-50]에서 이길 확률
- [i-1]점 경기했을 때 [j+50]에서 질 확률
- [i-1]점 경기했을 때 [j]에서 비길확률
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class java_14613 {
static double winPercent;
static double losePercent;
static double drawPercent;
// [i]번 경기를 했을 때 [j] 점일 확률
static double cache[][];
static double bronze;
static double silver;
static double gold;
static double platinum;
static double diamond;
static void partitionTier() {
for (int i = 0; i <= 2000; i++) {
if (0 <= i && i < 500) {
bronze += cache[20][i];
continue;
}
if (500 <= i && i < 1000) {
silver += cache[20][i];
continue;
}
if (1000 <= i && i < 1500) {
gold += cache[20][i];
continue;
}
if (1500 <= i && i < 2000) {
platinum += cache[20][i];
continue;
} else {
diamond += cache[20][i];
}
}
}
static void dp() {
for (int i = 1; i <= 20; i++) {
for (int j = 0; j <= 2000; j++) {
if (cache[i - 1][j] > 0) {
cache[i][j + 50] += cache[i - 1][j] * winPercent;
cache[i][j - 50] += cache[i - 1][j] * losePercent;
cache[i][j] += cache[i - 1][j] * drawPercent;
}
}
}
}
static void printResult() {
System.out.printf("%.8f\\n", bronze);
System.out.printf("%.8f\\n", silver);
System.out.printf("%.8f\\n", gold);
System.out.printf("%.8f\\n", platinum);
System.out.printf("%.8f\\n", diamond);
}
static void solve() {
cache = new double[21][2001];
cache[0][1000] = 1;
dp();
partitionTier();
printResult();
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
winPercent = Double.parseDouble(st.nextToken());
losePercent = Double.parseDouble(st.nextToken());
drawPercent = Double.parseDouble(st.nextToken());
solve();
br.close();
}
}
'Coding Test > BOJ' 카테고리의 다른 글
[BOJ/JAVA] 2036번: 수열의 점수 (0) | 2022.12.11 |
---|---|
[BOJ/JAVA] 1783번: 병든 나이트 (0) | 2022.12.11 |
[BOJ/JAVA] 1005번: ACM Craft (1) | 2022.12.05 |
[BOJ/JAVA] 1535번: 안녕 (0) | 2022.12.05 |
[BOJ/JAVA] 14501번: 퇴사 (0) | 2022.12.05 |