[BOJ 1041] 주사위 (Python)

박현우·2021년 4월 6일
0

BOJ

목록 보기
43/87

문제

주사위


문제 해설

주사위의 개수가 1일 때, 계산하는 것은 각 주사위 숫자를 모두 더한뒤 가장 큰 숫자를 뺍니다.
2일 때, 정육면체는 8칸을 가지고 있습니다. 윗칸은 모두 3면만 보이고, 밑칸은 모두 2면만 보입니다.
저희가 필요한 값은 주사위 1면, 2면, 3면의 최소값이기 때문에 최소값을 구해야 합니다.

1면을 구하는 방법은 그냥 주사위의 가장 최소값을 고르면 됩니다.
2면부터는 주사위의 마주보는 면은 절대 동시에 노출될 수 없기 때문에 각 마주보는 면끼리 짝지어서 짝 중 가장 작은값을 두개 고르면 됩니다.

ex) 123, 124, 236 고를수 있음.
126 125 고를 수 없음.

(1,6)(2,5)(3,4) 짝을 지은 후 작은 값을 고른다.

3면은 2면을 구하는 과정과 똑같습니다.



n = 2일때는 위의 그림과 같이 2,3면만 구하면 됩니다.


n = 3일때는 1면,2면,3면이 모두 존재합니다.

3면일 경우 반드시 4개, 2면일 경우 아랫 꼭지점 4개 + 8(n-2)
1면일 경우 5(n-2)^2 + 4*(n-2) 이런식으로 구했습니다.


풀이 코드

import sys

input = sys.stdin.readline
n = int(input())
dice = list(map(int, input().split()))
# 주사위는 N이 1일때 모든면을 더하고 가장 큰값을 뺀다.
# N이 2일 때 각 주사위에 2면, 3면만 보인다.
# N이 3이상일 때 각 주사위는 각각 1,2,3면을 모두 보인다.
# 주사위는 n=1일때를 제외하고 마주보는 면끼리는 절대 동시에 노출될 수 없다.
# 그러므로 예시1을 보면  123, 124, 236 이런식으로 3면이 노출 될 수 있지만,
# 126 이런식으로 마주보는면이 공존할 수 없기 때문에 각 마주보는 면 중 작은값끼리 더한다.

one = min(dice)
three = min(dice[0], dice[5]) + min(dice[1], dice[4]) + min(dice[2], dice[3])
two = three - max(min(dice[0], dice[5]), min(dice[1], dice[4]), min(dice[2], dice[3]))

if n == 1:
    print(sum(dice) - max(dice))
elif n == 2:
    # 윗면은 주사위 4개가 3면을 보이고, 아랫면은 주사위 4개가 2면을 보임.
    print(4 * (two + three))
else:
    # n>=3 이면 그림을 그려 3면, 2면, 1면이 어느 상황에 나오게 되는지 확인해본다.
    print(
        4 * three
        + (4 * (n - 1) + 4 * (n - 2)) * two
        + (4 * (n - 2) + 5 * (n - 2) * (n - 2)) * one
    )

0개의 댓글