1. 문제 설명
https://www.acmicpc.net/problem/1041
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()