https://www.acmicpc.net/problem/1041
1041번: 주사위
첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수
www.acmicpc.net
문제분석
주사위 면이 정해져있음을 유의할것.
풀이는 간단하다. 전개도를 접어서 주사위를 만들고, 그 주사위들을 합쳐서 N*N*N크기의 대형 주사위를 만든다.
이후, 바닥면을 제외한 5면의 숫자의 합이 최소일때 그 최소값은?
해결과정
중고등학교 수학적 감각이 있다면, 더욱 쉽게 풀 수 있는문제이다. 보통 이런문제는 N이 1일때,2일때,3이상일때~ 로 나눠서 풀기에, 이 문제도 동일하게 풀면 된다.
n=1인 경우: 전체 합에서 가장 큰 면 제외
n=2인 경우: 길게 붙어있지 않은(세 모서리가 만나게되는)세 면을 구성
n=3인 경우: 길게 붙어있지 않은 세 면을 구성
이때, 무작정 세 면의 합이 가장 작은 구성을 했다간, 반례가 생길 수 있다(1,1,50과 10,10,10의 경우, 전자가 결과가 작음)
이를 해결하기 위해 고민해봤는데, 문제의 시간제한이 2초로 충분하고, 부르트포스 알고리즘을 생각해봐도 대락72가지(예외 제외하면 더 줄어듬)의 경우만 생각하면된다 판단했다. 따라서 부르트포스(완전탐색)으로 해결하기로 하였다.
길게 붙어있지 않은 세 면을 구성하는 모든 경우를 계산하고, 그중 가장 작은값을 출력하는것으로 마무리했다.
n=int(input())
array=[]
array=list(map(int,input().split()))
result=[]
for i in range(6):#5-i만 temparr에 못들어감, 현재 첫번째 면은 i
arr=[]
temparr=[]#후보 넣을 배열
for k in range(6):
if not(k==5-i or k==i):
temparr.append([array[k],k])
#temparr에 i, 5-i빼고 다들어감
arr.append(array[i])
for j in range(4):
for p in range(4):
if j!=p and temparr[j][1]+temparr[p][1]!=5:
arr.append(temparr[j][0])
arr.append(temparr[p][0])
if n==1: #n이 1이면, 작은 5면
result.append(sum(array)-arr[-1])
elif n==2: #n이 2면, 작은3면*8-아래쪽1면
result.append(8*(arr[0]+arr[1]+arr[2])-4*(arr[2]))
else: #n이 3이상이면
result.append(8*(arr[0]+arr[1]+arr[2])-4*(arr[2])+12*(n-
2)*(arr[0]+arr[1])-4*arr[1]*(n-2)+(n-2)*(n-2)*5*(arr[0]))
arr=[]
arr.append(array[i])
print(min(result))

'알고리즘&백준' 카테고리의 다른 글
[JAVA] 백준 1034 램프 (0) | 2024.06.24 |
---|---|
[Python] 백준 2528 사다리 (1) | 2024.01.05 |
[Python] 백준 2493 탑 (2) | 2024.01.05 |
[Python] 백준 1711 직각삼각형 (0) | 2024.01.03 |
[Python] 백준 2591 숫자카드 (0) | 2023.11.06 |