풀이
주사위들은 아랫 면이 무엇이 올지 정해지면, 윗면과 옆면으로 무슨 숫자들이 오는지 알 수 있다.
이를 이용하여, 옆 면으로 올 수 있는 숫자들 중 _최댓값_을 한쪽 면으로 몰아버리면 된다.아랫 면의 인덱스를 넣으면 윗 면의 숫자가 무엇인지, 또 옆 면으로 올 수 있는 숫자들이 무엇인지 바로 알 수 있도록 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] }
옆 면들의 인덱스를 갖고 해당 인덱스의 주사위 숫자들 중 최댓값을 구하려면 아래와 같이 해야 한다.
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)
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
[백준 2615 python] 오목 (0) | 2021.08.13 |
---|---|
[백준 17615 python] 볼 모으기 (0) | 2021.08.13 |
[백준 2628 Python] 종이자르기 (0) | 2021.08.01 |
[백준 1244 Python] 스위치 켜고 끄기 (0) | 2021.07.25 |
[백준 2669 Python] 직사각형 네개의 합집합의 면적 구하기 (0) | 2021.07.25 |