본문 바로가기
🤔 알고리즘/시즌2-그리디-21.10.18~10.31

[백준] # 1041. 주사위 (파이썬)

by 말랑한곰탱이 2021. 11. 22.

문제 링크

 

https://www.acmicpc.net/problem/1041

 

1041번: 주사위

첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수

www.acmicpc.net

 

문제 내용

 

    +---+        
    | 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보다 작거나 같은 자연수이다.

 

출력

첫째 줄에 문제의 정답을 출력한다.

 

IDEA

 

우선 n이 1일때는 답이 (주사위에 쓰인 수의 합 - 가장 큰 수) 이다. n이 2이상일 때는 1면, 2면, 3면일 때의 최솟값을 식으로 표현할 수 있기 때문에, 식을 구한 후 값을 대입했다.

 

CODE

 

# 1041. 주사위 - 골드5
# a-f, c-d, b-e
# n이 1 일때, sum(a~f) - max(a~f)
# n이 2 이상 일때, 
# 3면 4개, 2면 (n-2)*4 + (n-1)*4 = 8n-12개, 1면 4*(n-2)*(n-1)+(n-2)*(n-2)개
# 1면 최솟값 :  (4*(n-2)*(n-1)+(n-2)*(n-2))*min
# 2면 최솟값 : (8n-12)*k
# k = min(a+min(b,c,d,e), b+min(c,d,f), c+min(e,f), d+min(e,f), e+f)
# 3면 최솟값 : 4*min(abc,abd,ade,aec,bcf,bdf,cef,def)

n = int(input())
a,b,c,d,e,f = map(int,input().split())
sum_dice = a+b+c+d+e+f
max_dice = max(a,b,c,d,e,f)
min_dice = min(a,b,c,d,e,f)
result = 0
if n == 1:
    result = sum_dice - max(a,b,c,d,e,f)
else:
    min_1 = (4*(n-2)*(n-1)+(n-2)*(n-2))*min_dice
    k = min(a+min(b,c,d,e), b+min(c,d,f), c+min(e,f), d+min(e,f), e+f)
    min_2 = (8*n-12)*k
    min_3 = 4*min(a+b+c,a+b+d,a+d+e,a+e+c,b+c+f,b+d+f,c+e+f,d+e+f)
    result = min_1 + min_2 + min_3
print(result)

 

사용 알고리즘

 

그리디

 

풀이 평

 

골드 문제 치곤 쉬웠다.