[BOJ] 2116번 : 주사위 쌓기(Go, Golang)

김영한·2021년 3월 31일
0

알고리즘

목록 보기
31/74

문제 링크 : 백준 2116번

[문제 접근]

가장 밑 주사위를 기준으로 아랫면에 올 수 있는 6가지의 경우를 돌면서 윗 주사위를 탐색하면 된다.

주사위는 기본적으로 A <--> F, B <--> D, C <--> E가 대칭이다.
옆면의 순서는 돌려가면서 최대값을 찾아야하므로 고려하지 않아도 된다.

  1. 1~6 인덱스를 돌면서 아랫면으로 지정해준다.
  2. 인덱스에 따라 bottom과 top을 지정해주고 옆면 중에 최대값을 찾아 갱신한다.
  3. 최대값을 num에 더해주고 다음 주사위의 bottom과 top을 지정해주어야 하는데 현재 주사위의 top에 있는 숫자와 다음 주사위의 index를 돌면서 같은 값이 나오면 그 값이 다음 주사위의 bottom이 된다.
  4. 쌓은 주사위 전체를 돌면 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)
}

0개의 댓글