카테고리 없음

[TIL] 99클럽 코테 스터디 35일차 TIL + 백준 17825 주사위 윷놀이

zincah 2024. 12. 1. 19:06
반응형

 

문제 풀이

 

문제 풀이

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    static StringTokenizer st;
    static int N;
    static int answer;
    static int[] Dice = new int[10+1]; 
    static int[] Order = new int[10+1]; 
    static ArrayList<Integer> OrderArr = new ArrayList<>();
    static Node root = new Node();

    static Node[] Mal = new Node[4+1]; 

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        st = new StringTokenizer(br.readLine());
        for(int i=1;i<11;i++){
            Dice[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.fill(Mal,root);

        initMap();
        permutation(1);
        System.out.println(answer);
    }

    static void permutation(int count){
        if(count>=11){
            Arrays.fill(Mal,root); 
            answer = Math.max(answer,gameStart());
            for(int i=1;i<5;i++){ 
                Mal[i].isHere = false;
            }
            return;
        }
        for(int i=1;i<5;i++){ 
            Order[count] = i; 
            permutation(count+1);
        }
    }

    static int gameStart(){
        int score = 0;
        boolean[] Goal = new boolean[5];

        for(int t=1;t<11;t++){
            int dice = Dice[t]; //1~5
            int nowMalIndex = Order[t]; //1~4
            Node nowMal = Mal[nowMalIndex]; 

            nowMal.isHere = false; 

            if(Goal[nowMalIndex]){
                return 0;
            }
            for(int i=0;i<dice;i++){ 
                if(i==0 && nowMal.isBlue){ 
                    nowMal = nowMal.getChild(true);
                }
                else{
                    nowMal  = nowMal.getChild(false);
                }

                if(nowMal.isEnd){ 
                    Goal[nowMalIndex] = true;
                    break;
                }
                if(i==dice-1){ 
                    if(!nowMal.isHere) { 
                        score += nowMal.value;
                        nowMal.isHere = true;
                        Mal[nowMalIndex] = nowMal;
                    }
                    else{
                        return 0;
                    }
                }
            }
        }
        return score;
    }

    static void initMap(){
        Node now = root;
        //40 -> 도착
        Node last40 = new Node(40);
        last40.child = new Node(0);
        last40.child.isEnd = true;

        //25 -> 30 -> 35 -> 40
        Node middle25 = new Node(25);
        Node tmp = middle25.child = new Node(30);
        tmp = tmp.child = new Node(35);
        tmp.child = last40;

        //2,4,6,8,10,13,16,19,25
        now = now.child = new Node(2);
        now = now.child = new Node(4);
        now = now.child = new Node(6);
        now = now.child = new Node(8);
        now = now.child = new Node(10);
        now.isBlue = true;

        tmp = now.blueChild = new Node(13);
        tmp = tmp.child = new Node(16);
        tmp = tmp.child = new Node(19);
        tmp.child = middle25;

        now = now.child = new Node(12);
        now = now.child = new Node(14);
        now = now.child = new Node(16);
        now = now.child = new Node(18);
        now = now.child = new Node(20);
        now.isBlue = true;

        tmp = now.blueChild = new Node(22);
        tmp = tmp.child = new Node(24);
        tmp.child = middle25;

        now = now.child = new Node(22);
        now = now.child = new Node(24);
        now = now.child = new Node(26);
        now = now.child = new Node(28);
        now = now.child = new Node(30);
        now.isBlue = true;

        tmp = now.blueChild = new Node(28);
        tmp = tmp.child = new Node(27);
        tmp = tmp.child = new Node(26);
        tmp.child = middle25;

        now = now.child = new Node(32);
        now = now.child = new Node(34);
        now = now.child = new Node(36);
        now = now.child = new Node(38);
        now.child = last40;
    }

    static class Node{
        int value; 
        boolean isEnd; 
        boolean isBlue; 
        boolean isHere; 
        Node child;
        Node blueChild;

        public Node(int value) {
            this.value = value;
        }

        public Node() {
        }

        Node getChild(boolean imBlue){
            if(!imBlue)
                return child; 
            else
                return blueChild; 
        }
    }
}

 

반응형