1. 문제 설명
https://www.acmicpc.net/problem/1041
1041번: 주사위
첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수
www.acmicpc.net
2. 아이디어
이 문제는 직접 그려서 해보는 게 빠르다.
여기서 재밌는 점은 N이 1인 경우를 제외하고는 그 어떤 곳에서도 주사위가 4면 이상 노출되는 면은 없다.
4면이 노출되면 문제가 다소 까다로워지겠지만 3면이면 사실 그냥
처음에 입력받은 값을 오름차순으로 정렬해서 가장 작은 3개의 값만 골라오면 된다.
그리고 솔직히 이 다음은 어느정도 노가다가 들어갔다.
N | 1면 | 2면 | 3면 |
2 | 0 | 4 | 4 |
3 | 9 | 12 | 4 |
4 | 28 | 20 | 4 |
5 | 57 | 28 | 4 |
N의 값에 따라 1, 2, 3면이 노출되는 주사위의 갯수를 직접 세보았는데 규칙성이 바로 드러난다.
다만 1면의 경우에는 파악이 어려운데 그건 주사위의 윗면과 옆면의 차이에서 비롯한다.
N | top | side |
2 | 0 | 0 |
3 | 1 | 2x4 |
4 | 2x2 | 6x4 |
5 | 3x3 | 12x4 |
6 | 4x4 | 20x4 |
이또한 직접 정리해보면 숨겨진 규칙을 찾아낼 수 있다.
정리해보면 점화식은 다음과 같다.
- 1면 : \((n-2)^{2} + 4(n-2)(n-1) = 5n^{2} - 16n + 12\)
- 2면 : 4 + 8(n-2) = 8n - 12
- 3면 : 4
3. 코드
def solution():
n = int(input())
value = list(map(int, input().split()))
min_value = []
total = 0
if n == 1:
value.sort()
total = sum(value[:5])
else:
min_value.append(min(value[0], value[5]))
min_value.append(min(value[1], value[4]))
min_value.append(min(value[2], value[3]))
min_value.sort()
total += min_value[0] * (5 * n**2 - 16*n + 12) # 1면
total += sum(min_value[:2]) * (8 * n - 12) # 2면
total += sum(min_value[:3]) * 4 # 3면
print(total)
solution()