[BOJ] 2116 주사위 쌓기

알파·2022년 11월 1일
0
post-custom-banner

접근법

재귀로 접근해서 풀어야하는 문제였다.. 너무 어려워
너무 어려워우어어어ㅓㅇ
위아래 인덱스는 항상 동일하게 바뀐다
0 -> 5
1 -> 3
2 -> 4
3 -> 1
4 -> 2
5 -> 0

따라서 topIdx와 bottomIdx를 정해주고 bottom값을 넘겨 재귀를 돌려주면 된다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Solution2116 {

    static int n, max;
    static int[][] dice;
    static int[] pair = {5, 3, 4, 1, 2, 0};
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        dice = new int[n][6];
        StringTokenizer st;

        for(int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j = 0; j < 6; j++) {
                dice[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        // 1층부터 쌓기
        for(int i = 0; i < 6; i++) {
            int topIdx = i;
            int bottomIdx = pair[i];
            int m = getMax(topIdx, bottomIdx, 0);
            pileDice(dice[0][topIdx], 1, m);
        }

        System.out.println(max);

    }

    static int getMax(int idx1, int idx2, int diceIdx) {
        int m = 0;
        for(int i = 0; i < 6; i++) {
            if(idx1 == i || idx2 == i) continue;
            m = Math.max(m, dice[diceIdx][i]);
        }
        return m;
    }

    static void pileDice(int bottom, int depth, int sum) {
        if(depth == n) {
            max = Math.max(max, sum);
            return;
        }
        int bottomIdx = 0;
        int topIdx = 0;
        for(int i = 0; i < 6; i++) {
            if(dice[depth][i] == bottom) {
                bottomIdx = i;
                break;
            }
        }

        topIdx = pair[bottomIdx];
        int m = getMax(topIdx, bottomIdx, depth);

        pileDice(dice[depth][topIdx], depth+1, sum+m);
    }
}
profile
I am what I repeatedly do
post-custom-banner

0개의 댓글