https://www.acmicpc.net/problem/1041
문제
+---+
| D |
+---+---+---+---+
| E | A | B | F |
+---+---+---+---+
| C |
+---+
주사위는 위와 같이 생겼다. 주사위의 여섯 면에는 수가 쓰여 있다. 위의 전개도를 수가 밖으로 나오게 접는다.
A, B, C, D, E, F에 쓰여 있는 수가 주어진다.
지민이는 현재 동일한 주사위를 N^3개 가지고 있다. 이 주사위를 적절히 회전시키고 쌓아서, N×N×N크기의 정육면체를 만들려고 한다. 이 정육면체는 탁자위에 있으므로, 5개의 면만 보인다.
N과 주사위에 쓰여 있는 수가 주어질 때, 보이는 5개의 면에 쓰여 있는 수의 합의 최솟값을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수는 50보다 작거나 같은 자연수이다.
출력
첫째 줄에 문제의 정답을 출력한다.
풀이
N = 1일 때는 가장 큰 부분을 바닥에 둔다. 즉 가장 높은 수를 제외한 나머지의 합이다.
N > 1일 때는 가장 작은 값을 가지는 부분이 최대한 많이 보이도록 둔다.
각 옆면에는 N^2개의 주사위가 보일 것이다.
이 중 가장 왼쪽 열의 N개의 주사위를 제외하고는 모두 가장 작은 값을 가지는 부분이 보이도록 한다. 이렇게 하면 가장 왼쪽 열의 N개의 주사위는 가장 작은 값을 가지는 부분의 오른쪽 부분이다. 이때 윗면의 네 모퉁이는 정해진다.
이제 윗면을 생각하자.
윗면의 가장자리를 제외한 (N-2)^2개의 주사위는 가장 작은 값을 가지는 부분이 보이도록 한다. 그리고 윗면의 네 모퉁이는 옆면을 쌓을 때 정해졌으므로, 나머지 4*(N-2)개의 주사위는 가장 작은 값을 가지는 부분의 오른쪽이 될 것이다.
소스 코드
n = int(input())
inputs = list(map(int, input().split()))
sum = 0
if n == 1:
inputs.sort()
for i in range(len(inputs) - 1):
sum += inputs[i]
else:
nums = []
for i in range(3):
num = inputs[i] if inputs[i] < inputs[5-i] else inputs[5-i]
nums.append(num)
nums.sort()
sum += 4*nums[0]*n*(n-1)
sum += nums[0]*(n-2)**2
sum += 4*nums[1]*n
sum += 4*nums[1]*(n-2)
sum += 4*nums[2]
print(sum)
'알고리즘 공부 > 백준' 카테고리의 다른 글
백준 14659번: 한조서열정리하고옴ㅋㅋ (파이썬) (0) | 2022.01.21 |
---|---|
백준 1343번: 폴리오미노 (파이썬) (0) | 2022.01.21 |
백준 15904번: UCPC는 무엇의 약자일까? (파이썬) (0) | 2022.01.20 |
백준 11497번: 통나무 건너뛰기 (파이썬) (0) | 2022.01.20 |
백준 2212번: 센서 (파이썬) (0) | 2022.01.20 |