개발조아

[BOJ/백준] 2116 주사위 쌓기 파이썬 본문

알고리즘/백준

[BOJ/백준] 2116 주사위 쌓기 파이썬

개발조아 2021. 8. 19. 16:49
728x90

문제 링크 : https://www.acmicpc.net/problem/2116

 

2116번: 주사위 쌓기

첫줄에는 주사위의 개수가 입력된다. 그 다음 줄부터는 한 줄에 하나씩 주사위의 종류가 1번 주사위부터 주사위 번호 순서대로 입력된다. 주사위의 종류는 각 면에 적혀진 숫자가 그림1에 있는

www.acmicpc.net

 

주사위를 수직으로 쌓을때 서로 맞닿은 부분의 눈이 같아야하고 전부다 쌓았을 때 양옆 주사위 눈의 합의 최대값을 구하는 문제이다.

 

주사위 눈은 1-6, 2-4, 3-5가 서로 위아래로 짝지어져있기 때문에 반대편은 자동적으로 따라온다.

나는 주사위 눈을 짝지어서 배열에 저장했다.

전체 주사위를 돌면서 저장한 주사위 눈의 짝에서 값을 찾고 반대쪽을 다음 대상으로 바꿔가면서 반복문을 진행했다.

 

양옆의 숫자중 최대값은 4,5,6중 하나이므로 6,5가 있는지 체크해서 최대값을 구해서 더해나갔다.

 

from sys import stdin
input = stdin.readline

n = int(input())

dices = [[] for _ in range(n)]
answer = 0
for idx in range(n):
    nums = list(map(int, input().split()))

    dices[idx].append((nums[0],nums[5]))
    dices[idx].append((nums[1],nums[3]))
    dices[idx].append((nums[2],nums[4]))

def solv():
    for dice in dices[0]:
        for target in dice:
            select_num(target)
    print(answer)

def select_num(target):
    global answer
    total = 0
    for idx in range(n):
        for dice in dices[idx]:
            if target in dice:
                if 6 in dice:
                    if 5 in dice:
                        total += 4
                    else:
                        total += 5
                else:
                    total += 6
                if target == dice[0]:
                    target = dice[1]
                    break
                else:
                    target = dice[0]
                    break
    answer = max(answer,total)
solv()

 

Comments