재귀로 접근해서 풀어야하는 문제였다.. 너무 어려워
너무 어려워우어어어ㅓㅇ
위아래 인덱스는 항상 동일하게 바뀐다
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);
}
}