baby_ohgu 2021. 1. 30. 02:02

www.acmicpc.net/problem/1041

 

1041번: 주사위

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

www.acmicpc.net

 

문제풀이

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 풀이를 참고한 코드입니다.

kkk4872.tistory.com/130

 

문제풀이나 코드에서 이상한 부분 지적은 언제나 환영합니다!