문제 링크 : 백준 2116번
가장 밑 주사위를 기준으로 아랫면에 올 수 있는 6가지의 경우를 돌면서 윗 주사위를 탐색하면 된다.
주사위는 기본적으로 A <--> F, B <--> D, C <--> E가 대칭이다.
옆면의 순서는 돌려가면서 최대값을 찾아야하므로 고려하지 않아도 된다.
package main
import (
	"bufio"
	"fmt"
	"os"
)
var (
	r   = bufio.NewReader(os.Stdin)
	w   = bufio.NewWriter(os.Stdout)
	n   int
	arr [10001][7]int
)
func check(index int) (int, int) {
	if index == 1 {
		return 1, 6
	} else if index == 2 {
		return 2, 4
	} else if index == 3 {
		return 3, 5
	} else if index == 4 {
		return 4, 2
	} else if index == 5 {
		return 5, 3
	} else {
		return 6, 1
	}
}
func main() {
	defer w.Flush()
	fmt.Fscan(r, &n)
	for i := 1; i <= n; i++ {
		for j := 1; j <= 6; j++ {
			fmt.Fscan(r, &arr[i][j])
		}
	}
	ans := 0
	for i := 1; i <= 6; i++ {
		bottom, top := check(i)
		num := 0
		tnum := arr[n][top]
		for j := n; j >= 1; j-- {
			max := 0
			for k := 1; k <= 6; k++ {
				if k != bottom && k != top {
					if max < arr[j][k] {
						max = arr[j][k]
					}
				}
			}
			num += max
			if j > 1 {
				var tmp int
				for k := 1; k <= 6; k++ {
					if arr[j-1][k] == tnum {
						tmp = k
						break
					}
				}
				bottom, top = check(tmp)
				tnum = arr[j-1][top]
			}
		}
		if ans < num {
			ans = num
		}
	}
	fmt.Fprintln(w, ans)
}