https://solved.ac/event/220401
솔브닥에서 만우절이라고 메이플 스타포스 강화 시스템을 그대로 베낀 이벤트를 냈다.
가장 필요한 기능이라고 한다면, '현재 별조각이 piece개 있는데, target성까지 갈 확률이 얼마일까?라고 생각하여 해당 연산을 구현하였다. 순수한 브루트포스 노가다.
코드
public class 한별포스 {
public static void main(String[] args) {
starforce(10000, 23); // (가지고 있는 별조각 개수, 목표)
}
static void starforce(int piece, int target) {
double ans = 0;
int T = 10000;
// 24->25 확률 몰라서 구현 안 함, 실제 메이플이랑 미묘하게 값이 다름
// 한별캐치 적용: 한별 스킨 있는 사람만 가능
double[] success = {0.998, 0.945, 0.893, 0.893, 0.84,
0.788, 0.735, 0.683, 0.63, 0.578,
0.525, 0.473, 0.42, 0.368, 0.315,
0.315, 0.315, 0.315, 0.315, 0.315,
0.315, 0.315, 0.032, 0.02};
double[] fail = {0.002, 0.055, 0.107, 0.107, 0.16,
0.212, 0.265, 0.317, 0.37, 0.422,
0.475, 0.528, 0.574, 0.62, 0.671,
0.664, 0.664, 0.664, 0.658, 0.658,
0.617, 0.617, 0.775, 0.686};
for (int t = 0; t < T; t++) {
int curPiece = piece;
int level = 0;
int chanceStack = 0; // 하락스택 2면 찬스타임
while (true) {
if (curPiece < pieceNeeded(level)) break;
curPiece -= pieceNeeded(level);
if (chanceStack == 2) {
chanceStack = 0;
level++;
continue;
}
// 난수 추출
double prob = Math.random();
// 성공
if (prob <= success[level]) {
level++;
chanceStack = 0;
}
// 실패 - 하락 or 유지
else if (prob <= success[level] + fail[level]) {
if (level > 10 && level%5 != 0) {
level--;
chanceStack++;
}
}
// 파괴
else {
level = 12;
chanceStack = 0;
}
if (level == target) {
ans++;
break;
}
}
}
System.out.println(ans/T);
}
static int pieceNeeded(int level) {
if (level < 10) return 1;
else return level % 5;
}
}
P.S. 실제 메이플에서도 22성은 없는데 솔브닥에서 먼저 가져보네ㅎㅎ;;
'PS > Implementation' 카테고리의 다른 글
백준 18809번: Gaaaaaaaaaarden (JAVA) (0) | 2022.04.06 |
---|---|
백준 5373번: 큐빙 (JAVA) (0) | 2022.04.02 |
백준 17825번: 주사위 윷놀이 (0) | 2022.03.30 |
백준 24467번: 혼자 하는 윷놀이 (JAVA) (0) | 2022.02.15 |
백준 10158번: 개미 (JAVA) (2) | 2022.02.10 |