[BOJ] 2116번 주사위 쌓기 - 파이썬

YOONKEEM·2021년 7월 25일
0

BOJ

목록 보기
19/60

📒 문제

천수는 여러 종류의 주사위를 가지고 쌓기 놀이를 하고 있다. 주사위의 모양은 모두 크기가 같은 정육면체이며 각 면에는 1부터 6까지의 숫자가 하나씩 적혀있다. 그러나 보통 주사위처럼 마주 보는 면에 적혀진 숫자의 합이 반드시 7이 되는 것은 아니다.

주사위 쌓기 놀이는 아래에서부터 1번 주사위, 2번 주사위, 3번 주사위, … 의 순서로 쌓는 것이다. 쌓을 때 다음과 같은 규칙을 지켜야 한다: 서로 붙어 있는 두 개의 주사위에서 아래에 있는 주사위의 윗면에 적혀있는 숫자는 위에 있는 주사위의 아랫면에 적혀있는 숫자와 같아야 한다. 다시 말해서, 1번 주사위 윗면의 숫자는 2번 주사위 아랫면의 숫자와 같고, 2번 주사위 윗면의 숫자는 3번 주사위 아랫면의 숫자와 같아야 한다. 단, 1번 주사위는 마음대로 놓을 수 있다.

이렇게 쌓아 놓으면 긴 사각 기둥이 된다. 이 사각 기둥에는 4개의 긴 옆면이 있다. 이 4개의 옆면 중에서 어느 한 면의 숫자의 합이 최대가 되도록 주사위를 쌓고자 한다. 이렇게 하기 위하여 각 주사위를 위 아래를 고정한 채 옆으로 90도, 180도, 또는 270도 돌릴 수 있다. 한 옆면의 숫자의 합의 최댓값을 구하는 프로그램을 작성하시오.

입력

첫줄에는 주사위의 개수가 입력된다. 그 다음 줄부터는 한 줄에 하나씩 주사위의 종류가 1번 주사위부터 주사위 번호 순서대로 입력된다. 주사위의 종류는 각 면에 적혀진 숫자가 그림1에 있는 주사위의 전개도에서 A, B, C, D, E, F 의 순서로 입력된다. 입력되는 숫자 사이에는 빈 칸이 하나씩 있다. 주사위의 개수는 10,000개 이하이며 종류가 같은 주사위도 있을 수 있다.

<그림 1>: https://www.acmicpc.net/problem/2116

출력

첫줄에 한 옆면의 숫자의 합이 가장 큰 값을 출력한다.

✏️ 풀이

이 문제는 첫 1층에 있는 주사위에서 나올 수 있는 6가지 경우를 조사하면서 나머지 주사위들의 MAX값을 살펴보면 되는 문제였다. 하지만 바닥과 윗부분의 값을 어떻게 해야할지 많이 생각해보았는데, 처음에는 for문 반복을 통해 돌려볼까하다가 효율적이지 못한 것 같아 포기했다.
방법을 고민하다가 다른 풀이에는 어떤 방법을 적용했나 찾아보았고, 딕셔너리를 사용하는 방법을 보게 되었다.
확실히 딕셔너리가 유용하게 쓰이는 경우가 꽤 있는 것 같아, 더욱 공부해봐야겠다.

dice_num = int(input())
dice_list = []
result_list = [0]*dice_num
for i in range(dice_num):
    dice_list.append(list(map(int, input().split())))
rotate = {0 : 5, 1 : 3, 2 : 4, 3 : 1, 4 : 2, 5 : 0}

sum_result = []
for i in range(6):
    # 1층 주사위
    max_list = []
    dice = [1, 2, 3, 4, 5, 6]
    bottom = dice_list[0][i]
    top = dice_list[0][rotate[i]]
    dice.remove(bottom)
    dice.remove(top)
    max_list.append(max(dice))
    for j in range(1, dice_num):
        # 나머지 위층 주사위
        dice = [1, 2, 3, 4, 5, 6]
        bottom = top
        dice.remove(bottom)
        top = dice_list[j][rotate[dice_list[j].index(top)]]
        dice.remove(top)
        max_list.append(max(dice))
    # sum_result에 max합을 저장
    sum_result.append(sum(max_list))

print(max(sum_result))

위의 풀이로 메모리는 30476kb 시간은 568ms로 다른 언어에 비해 늦지만 파이썬 결과 중에서는 적당한 결과를 출력한 것을 확인할 수 있었다.

profile
진짜 개발자를 목표로 하며 전진하는 가짜 개발자입니다 😊

0개의 댓글