[BOJ] 2116번 : 주사위 쌓기(Go, Golang)
문제 링크 : 백준 2116번
[문제 접근]
가장 밑 주사위를 기준으로 아랫면에 올 수 있는 6가지의 경우를 돌면서 윗 주사위를 탐색하면 된다.
주사위는 기본적으로 A <--> F, B <--> D, C <--> E가 대칭이다.
옆면의 순서는 돌려가면서 최대값을 찾아야하므로 고려하지 않아도 된다.
- 1~6 인덱스를 돌면서 아랫면으로 지정해준다.
- 인덱스에 따라 bottom과 top을 지정해주고 옆면 중에 최대값을 찾아 갱신한다.
- 최대값을 num에 더해주고 다음 주사위의 bottom과 top을 지정해주어야 하는데 현재 주사위의 top에 있는 숫자와 다음 주사위의 index를 돌면서 같은 값이 나오면 그 값이 다음 주사위의 bottom이 된다.
- 쌓은 주사위 전체를 돌면 ans를 갱신해주고 1로 돌아간다.
[소스 코드]
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)
}
Author And Source
이 문제에 관하여([BOJ] 2116번 : 주사위 쌓기(Go, Golang)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@soosungp33/BOJ-2116번-주사위-쌓기Go저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)