Algorithm & Problem Solving/그리디 알고리즘(Greedy)
[백준 1041] 주사위 (Python)
baby_ohgu
2021. 1. 30. 02:02
문제풀이
N, arr : 입력값
ans : 보이는 5면 합의 최소값
min_lists : 1, 2, 3 면의 주사위의 최소값
개인적으로 굉장히 어려운 문제였다 ㅠㅠ.. 주사위와 같은 기하적인 문제 생각하는 것이 너무 어렵다...
만들어지는 완성체는 큐브 모양인데, 큐브에서 각각의 블록이 보일 수 있는 면은 1, 2, 3 개 중 하나이다.
면이 1개 보이는 블록 개수 : 4 * (N - 2) * (N - 1) + (N - 2) ** 2
면이 2개 보이는 블록 개수 : 4 * (N - 1) + 4 * (N - 2)
면이 3개 보이는 블록 개수 : 4 (가장 상단 모서리 4개)
이 블록 개수를 세는 것이 굉장히 까다로웠는데, 3*3 큐브와 4*4 큐브를 보면서 겨우 이해하게 되었다 ㅠㅠ
이를 이용해서 결과에 (1면 블록의 최소값 * 1면 블록 개수) + (2면 블록의 최소값 * 2면 블록 개수) + (3면 주사위의 최소값 * 3면 블록 개수) 를 더해주면 된다.
기하학적 감각이 필요한 것 같다...ㅠㅠ
코드
import sys
if __name__ == '__main__':
N = int(input())
arr = list(map(int, sys.stdin.readline().split()))
ans = 0
min_lists = []
if N == 1:
arr.sort()
for i in range(5):
ans += arr[i]
else:
min_lists.append(min(arr[0], arr[5]))
min_lists.append(min(arr[1], arr[4]))
min_lists.append(min(arr[2], arr[3]))
min_lists.sort()
# 1, 2, 3 면의 주사위 최소값
min1 = min_lists[0]
min2 = min_lists[0] + min_lists[1]
min3 = sum(min_lists)
# 1, 2, 3 면의 주사위 개수
n1 = 4 * (N - 2) * (N - 1) + (N - 2) ** 2
n2 = 4 * (N - 1) + 4 * (N - 2)
n3 = 4
ans += min1 * n1
ans += min2 * n2
ans += min3 * n3
print(ans)
결과
위 풀이는 'kkk4872' 님의 Python 풀이를 참고한 코드입니다.
문제풀이나 코드에서 이상한 부분 지적은 언제나 환영합니다!