PS/Implementation

한별포스

닻과매 2022. 4. 1. 15:07

https://solved.ac/event/220401

 

solved.ac

알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 난이도 및 티어 정보 제공

solved.ac

 

솔브닥에서 만우절이라고 메이플 스타포스 강화 시스템을 그대로 베낀 이벤트를 냈다.

가장 필요한 기능이라고 한다면, '현재 별조각이 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성은 없는데 솔브닥에서 먼저 가져보네ㅎㅎ;;