주사위
문제
+---+
| D |
+---+---+---+---+
| E | A | B | F |
+---+---+---+---+
| C |
+---+
주사위는 위와 같이 생겼다. 주사위의 여섯 면에는 수가 쓰여 있다. 위의 전개도를 수가 밖으로 나오게 접는다.
A, B, C, D, E, F에 쓰여 있는 수가 주어진다.
지민이는 현재 동일한 주사위를 N3개 가지고 있다. 이 주사위를 적절히 회전시키고 쌓아서, N×N×N크기의 정육면체를 만들려고 한다. 이 정육면체는 탁자위에 있으므로, 5개의 면만 보인다.
N과 주사위에 쓰여 있는 수가 주어질 때, 보이는 5개의 면에 쓰여 있는 수의 합의 최솟값을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수는 50보다 작거나 같은 자연수이다.
출력
첫째 줄에 문제의 정답을 출력한다.
처음에 어떻게 푸나 생각했는데 주사위의 3면이 보이는 부분과 2면이 보이는 부분 1면이 보이는 부분이 있다는 것을 알게 되었다.
그래서 주사위에서 1, 2, 3면이 보일 수 있는 최소값을 구하면 된다고 생각하였다.
그래서 2면의 최소값은 총 12개의 조합 중에 하나 3면은 8개의 조합 중 하나를 고르면 되는 거고 1면은 가장 작은 값을 고르면 된다.
그리고 생각할 것이 각 면이 몇개씩 있는가이다. 3면이 보이는 부분은 각 꼭지점 4개, 2면은 모서리변 (N-1)개 4모서리, (N-2)개 4모서리, 1면은 (N-1)*(N-2)개 4면, (N-2)*(N-2)개 면 1개
총 3면 4개, 2면 4*(N-1)+4*(N-2), 1면 4*(N-1)*(N-2) + (N-2)*(N-2) 이다.
하지만 이렇게 풀면 89%에서 틀리는데 그 이유는 N = 1일 때, 틀리게 된다. 그래서 N=1일 때는 따로 구하였다.
import sys
input = sys.stdin.readline
N = int(input().strip())
A, B, C, D, E, F = map(int,input().split())
# N이 1일 때,
# 최대값인 면만 빼고 보여주면 된다.
if N == 1:
print(A+B+C+D+E+F - max(A, B, C, D, E, F))
# 그렇지 않으면
# 구한다.
else:
# 1면짜리 최소값
min1 = min(A,B,C,D,E,F)
# 2면짜리 최소값
min2 = min(A+B,A+C,A+D,A+E,B+C,C+E,E+D,D+B,F+B,F+C,F+D,F+E)
# 3면짜리 최소값
min3 = min(A+B+C,A+C+E,A+E+D,A+D+B,F+B+C,F+C+E,F+E+D,F+D+B)
# 각 면의 갯수에 최소값을 곱한다.
total = min1 * ((N-1)*(N-2)*4 + (N-2)*(N-2)) + min2 * ((N-1)*4 + (N-2)*4) + min3 * 4
print(total)
'@@@ 알고리즘 > 백준 스터디' 카테고리의 다른 글
5557(1학년) - 해결 (0) | 2021.12.11 |
---|---|
19598(최소 회의실 개수) - 참고 (0) | 2021.12.08 |
20311(화학 실험) - 해결 (0) | 2021.12.06 |
1107(리모컨) - 해결 (0) | 2021.12.05 |
1613(역사) - pypy해결 (0) | 2021.12.04 |