풀이

  1. 주사위들은 아랫 면이 무엇이 올지 정해지면, 윗면과 옆면으로 무슨 숫자들이 오는지 알 수 있다.
    이를 이용하여, 옆 면으로 올 수 있는 숫자들 중 _최댓값_을 한쪽 면으로 몰아버리면 된다.

  2. 아랫 면의 인덱스를 넣으면 윗 면의 숫자가 무엇인지, 또 옆 면으로 올 수 있는 숫자들이 무엇인지 바로 알 수 있도록 key-value 형태, 즉 딕셔너리를 만든다.

    bottom_to_top = {
        0: 5,
        1: 3,
        2: 4,
        3: 1,
        4: 2,
        5: 0
    }
    
    get_side_idxes = {
        0: [1, 2, 3, 4],
        1: [0, 2, 4, 5],
        2: [0, 1, 3, 5],
        3: [0, 2, 4, 5],
        4: [0, 1, 3, 5],
        5: [1, 2, 3, 4]
    }
  3. 옆 면들의 인덱스를 갖고 해당 인덱스의 주사위 숫자들 중 최댓값을 구하려면 아래와 같이 해야 한다.

    dice_nums = [6, 4, 2, 5, 1, 3]
    side_idxes = [1, 2, 3, 4]
    
    side_nums = []
    for idx in side_idxes:
        num = dice_nums[idx]
        side_nums.append(num)
    
    max_num = max(side_nums)

    하지만, 이를 컴프리헨션 문법을 이용하면 간단하게 수행할 수 있다.

    dice_nums = [6, 4, 2, 5, 1, 3]
    side_idxes = [1, 2, 3, 4]
    
    max_num = max(dice_nums[idx] for idx in side_idxes)

    혹은, 람다식과 map 함수를 이용해서도 할 수 있다.

    max_num = max(map(lambda idx: dice_nums[idx], side_idxes))

    두 방법으로 코드를 제출해 본 결과, 람다식과 map 함수를 이용한 경우가 더 수행시간이 빨랐다.

코드

n = int(input())

dice_nums = []
for i in range(n):
    dice_nums.append(list(map(int, input().split())))

bottom_to_top = {
    0: 5,
    1: 3,
    2: 4,
    3: 1,
    4: 2,
    5: 0
}

get_side_idxes = {
    0: [1, 2, 3, 4],
    1: [0, 2, 4, 5],
    2: [0, 1, 3, 5],
    3: [0, 2, 4, 5],
    4: [0, 1, 3, 5],
    5: [1, 2, 3, 4]
}

max_total = 0
for i in range(6):
    top_idx = bottom_to_top[i]
    top_num = dice_nums[0][top_idx]
    side_idxes = get_side_idxes[i]
    # total = max(map(lambda idx: dice_nums[0][idx], side_idxes))
    total = max(dice_nums[0][idx] for idx in side_idxes)

    for j in range(1, len(dice_nums)):
        bottom_idx = dice_nums[j].index(top_num)
        top_idx = bottom_to_top[bottom_idx]
        top_num = dice_nums[j][top_idx]
        side_idxes = get_side_idxes[bottom_idx]
        # total += max(map(lambda idx: dice_nums[j][idx], side_idxes))
        total += max(dice_nums[j][idx] for idx in side_idxes)

    if max_total < total:
        max_total = total

print(max_total)

+ Recent posts