https://www.acmicpc.net/problem/2116
n=int(input())
dices=[]
diceConnect={0:5, 5:0, 1:3, 3:1, 2:4, 4:2}
for i in range(n):
dices.append(list(map(int,input().split())))
answer=0
def sumWithout(j,a,b):
v=0
for i in range(6):
if i==a or b==i:
continue
v=max(v,dices[j][i])
return v
for i in range(6):
down=i
downNum=dices[0][i]
sumValue=0
for j in range(n):
up=diceConnect[down]
upNum=dices[j][up]
sumValue+=sumWithout(j,down,up)
if j!=n-1:
down=dices[j+1].index(upNum)
answer=max(sumValue,answer)
print(answer)
주사위를 쌓아 올렸을 때, 맞닿는 면끼리는 같은 숫자 이도록 쌓는 방법이다. 이 때 옆쪽면이 최대 숫자의 합이 되도록 맞추는 문제이다.
그렇게 하기 위해서는 각 주사위의 아래, 윗면을 먼저 결정해야 하는데 한면이 결정되면 다른 한면들이 결정되므로 맨 아랫쪽 면 주사위를 기준으로 1~6까지의 숫자를 완전탐색한다. 시간복잡도는 2초나 주기 때문에 충분하며 N이 그렇게 크지도 않기 때문이다.
아랫면을 결정될 때마다 다른 주사위들의 위, 아래 면들을 찾아 갱신하고 그 숫자들을 제외한 숫자중 가장 큰 숫자를 찾아서 더해주면 된다. 연산이 복잡해지는거 같아서 큰 숫자를 찾는 알고리즘은 함수로 빼두었다.
이렇게 Python으로 백준의 "주사위 쌓기" 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊