백준 1041번
https://www.acmicpc.net/problem/1041
문제
후기
코딩적인 접근보단 기하학적으로 접근한 문제다.
일단 주사위 면에 써 있는 숫자중 N이 1인 경우를 제외하면
가장 작은 숫자 3개로 정육면체를 구성할 수 있다. 이를 위해 전개도에서 마주보는 면 중에서
작은 값을 리스트에 정렬하는 식으로 작은 숫자 3개를 정렬한 리스트를 만들었다.
(2×2×2)의 정육면체에서는 가장 작은수가 8번, 다음으로 작은 수가 1×8번, 제일 큰 수가 4번
(3×3×3)의 정육면체에서는 가장 작은수가 25번, 다음으로 작은 수가 2×8번, 제일 큰 수가 4번
(4×4×4)의 정육면체에서는 가장 작은수가 52번, 다음으로 작은 수가 3×8번, 제일 큰 수가 4번
즉 N이 1이 아닐 때, 두번 째로 작은 수는 (N-1)*8번, 제일 큰 수는 무조건 4번 ,
가장 작은 수는 이를 제외한 값 만큼 나온다는 규칙을 찾았고, 이를 코드에 적용했다.
문제를 푸는 방법엔 여러 방법이 있겠지만, 나중에 코딩테스트를 볼 때나
실제 업무를 할 때도 어쨌든 문제를 끝까지 해결하는 능력이 필요하다고 생각하기 때문에
내가 자신있는 방법으로 문제를 푸는것에 집중한 문제였다.
N이 1일때는 처음의 리스트에서 가장 큰 값을 제외한 나머지의 값들을 더해주면 된다.
N이 1이 아닐 때는 위의 규칙을 적용하여 코드로 만들어 주면 답을 구할 수 있었다
나의 풀이
import sys
input = sys.stdin.readline
N = int(input())
li = (list(map(int,input().split())))
sorted_li = sorted(li)
# 주사위의 전개도에 따라 정렬
new_li = []
new_li.append(min(li[0], li[5])) #A는 F면과 마주본다
new_li.append(min(li[1], li[4])) #B는 E면과 마주본다
new_li.append(min(li[2], li[3])) #C는 D면과 마주본다
new_li.sort()
K = (N*N*5) #곱해야하는 면의 개수 (EX) 면이 2개면 구해야하는 면은 20, 3개면 45 4개면 80.... )
T = 8 * (N-1)
if N == 1:
print( sorted_li[0] + sorted_li[1]+sorted_li[2]+sorted_li[3]+sorted_li[4] )
else:
result = ( (new_li[2]*4) + (new_li[1]*T) + (new_li[0] * (K-T-4)))
print(result)