[백준 1041] 주사위

Junyoung Park·2022년 4월 12일
0

코딩테스트

목록 보기
360/631
post-thumbnail

1. 문제 설명

주사위

2. 문제 분석

겉면에 드러나는 최솟값을 구하는 문제로, 전개도 상 마주보는 두 수가 존재하므로 이 중 최솟값을 3개 고른다. 주사위의 특정 면이 3개, 2개, 1개씩 드러나는 횟수를 구할 수 있으므로 이를 카운트하는 그리디 알고리즘.

3. 나의 풀이

import sys

n = int(sys.stdin.readline().rstrip())
dice = list(map(int, sys.stdin.readline().rstrip().split()))

if n == 1: print(sum(dice)-max(dice))
else:
    times = [4 * (n-1) * (n-2) + (n-2) * (n-2), 4 * (n-1) + 4 * (n-2), 4]
    # 1면, 2면, 3면이 나오는 주사위 개수
    selected_numbers = [min(dice[0], dice[5]), min(dice[2], dice[3]), min(dice[1], dice[4])]
    # 전개도에서 마주보는 두 수 중 최솟값 선정: 3개의 수
    selected_numbers.sort()
    for i in range(1, 3):
        selected_numbers[i] += selected_numbers[i-1]
        # selected_numbers[0]은 세 수 중 한 면만, [1]은 두 면이, [2]은 세 면이 드러날 때 보이는 수의 합
        # 최솟값이므로 오름차순 정렬 후 누적 합
    total = 0
    for num1, num2 in zip(times, selected_numbers):
        total += num1 * num2
        # n번 나타날 때 보이는 수 * n번 나타나는 수 합
    print(total)
profile
JUST DO IT

0개의 댓글