문제 링크 : 백준 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)
}