BAEKJOON #1041 주사위 (Greedy) - python

nathan·2021년 6월 29일
0

알고리즘문제

목록 보기
6/102

주사위

출처 : 백준 #1041

시간 제한메모리 제한
2초128 MB

문제

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


출력

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


입출력 예시

예제 입력 1

2
1 2 3 4 5 6

예제 출력 1

36


예제 입력 2

3
1 2 3 4 5 6

예제 출력 2

69


예제 입력 3

1000000
50 50 50 50 50 50

예제 출력 3

250000000000000


예제 입력 4

10
1 1 1 1 50 1

예제 출력 4

500


풀이

풀이 설명

  • 맨 꼭대기 층일 때
    • 1개의 면만 보일 때 : N^2
    • 2개의 면만 보일 때 : N^2 - (N-2)^2
    • 3개의 면만 보일 때 : 4
  • 맨 꼭대기 층이 아닐 때
    • 1개의 면만 보일 때 : N^2 - (N-2)^2
    • 2개의 면만 보일 때 : 4

Point

  • 처음에는 주사위 눈을 적은 수대로 정렬하려고 했었는데, 자꾸 틀렸다.
  • A, B, C, D, E, F면이 각각 정해져있었기 때문에 A-F, B-E, C-D 로 섹션을 나누어 최솟값을 따로 저장하였더니 풀 수 있었다.

python code

# 백준 1041번
from sys import stdin

def findMin(n, dice):
    # dice.sort()  # 오름차순으로 정렬 -> A B C D E F 면이 각각 정해져있기 때문에 무작위로 섞으면 안됨 .. 틀린 이유
    result = 0
    new = []
    
    if n == 1:    # 주사위가 1개일 때
        result = sum(dice) - max(dice)
        return result
    else:
        new.append(min(dice[0], dice[5]))
        new.append(min(dice[1], dice[4]))
        new.append(min(dice[2], dice[3]))
        new.sort()

        result += new[0]*(n**2) + new[1]*(n**2 - (n-2)**2) + new[2]*4   # 맨 꼭대기 층
        result += (new[0]*(n**2 - (n-2)**2) + new[1]*4) * (n-1)   # 모서리 4개 
        return result
            
n = int(stdin.readline())
dice = list(map(int, stdin.readline().split()))

result = findMin(n, dice)
print(result)
profile
나는 날마다 모든 면에서 점점 더 나아지고 있다.

0개의 댓글