생각해놓은 풀이는 여러가지가 될 수 있지만 두 가지 방법을 시도해보았습니다.
첫 번째 방법은 2개 2개 2개 짝을 짓고 이전 주사위의 맨 위의 값이 들어있는 짝을 제외한 4개중 가장 큰 값을 층마다 더해주고, 맨 위의 값이 들어있는 짝에 들어있는 맨 위의 값이 아닌 수가 곧 다음 주사위에서는 이전 주사위의 맨 위의 값이 되도록 코드를 짰습니다.
from sys import stdin
input=stdin.readline
n=int(input())
stack=[]
mx=0
for i in range(n):
dice=list(map(int,input().split()))
pair=[[dice[1],dice[3]],[dice[0],dice[5]],[dice[2],dice[4]]]
stack.append(pair)
for floor in stack[0]:
line=[]
for _ in stack[0]:
if _!= floor:
line+=_
for j in range(2):
s=max(line)
top=floor[j]
bottom=floor[~j]
for i in range(1,n):
line=[]
for side in stack[i]:
if top in side:
for i in range(2):
if side[i]!=top:
nexttop=side[i]
else:
line+=side
bottom=top
top=nexttop
s+=max(line)
mx=max(s,mx)
print(mx)
입력을 받을 때 0,5 2,4 3,5 이렇게 묶어서 넣어주고, 첫 번째 층을 기준으로 가장 바깥쪽의 for문은 3번 반복(2쌍씩 3개를 넣었으므로,) 그리고 선택되지 않은 두개의 쌍의 값중 최댓값을 합을 저장할 변수의 처음 값으로 해주었습니다.
선택된 쌍 안에도 반복문을 넣어 0,~0와 1,~1 이렇게 해서 맨 위의 값으로 사용해주었습니다. 그 다음 1~n까지 아까 입력받은 값들을 돌아다니며 쌍 안에 이전 주사위의 맨 위의 값이 있는 것을 찾아주고 그 쌍안의 다른수를 다음 주사위에서 쓸 top값 그리고 그 쌍이 아닌 다른 쌍들 중 가장 큰 값을 합에 저장해주었습니다.
아쉽게도 '틀렸습니다'가 떴습니다. 어제 인생 첫 노가다뛰고 와서 피곤한 상태라 그런지 코드를 짤 때 아무생각 없이 짠 모습입니다.. 조금만 고치면 정답이 될 것 같지만 코드도 더럽고,, 어찌어찌 맞춘다 해도 만족스럽지 않을 것 같아 버리고 다시 짰습니다.
from sys import stdin
input=stdin.readline
n=int(input())
toplist=[[0,0,0,0,0,0]for i in range(n)]
sumlist=[[0,0,0,0,0,0]for i in range(n)]
floor=list(map(int,input().split()))
relation={0:5,1:3,2:4,3:1,4:2,5:0}
for idx,i in enumerate(floor):
toplist[0][idx]=i
for j in range(1,7):
if j!=i and j!=floor[relation[idx]]:
sumlist[0][idx]=max(sumlist[0][idx],j)
for height in range(1,n):
floor=list(map(int,input().split()))
for ver,i in enumerate(toplist[height-1]):
for idx,j in enumerate(floor):
if j==i:
nexttop=floor[relation[idx]]
for num in range(1,7):
if num!=j and num != nexttop:
sumlist[height][ver]=max(sumlist[height][ver],sumlist[height-1][ver]+num)
toplist[height][ver]=nexttop
print(max(sumlist[-1]))
dp와 흡사한 모양새로 풀었습니다. 입력을 모두 받은 뒤 탐색하는 것이 아니라 입력을 받을때 마다 탐색을 해주었습니다. 이전의 코드가 n번을 6번씩 이라면 이 코드는 n번을 6번씩 했다는 느낌인듯 합니다. 위치간의 상관관계를 relation을 활용하여 연결해주고 파이썬에 있는 간편한 기능인 enumerate를 이용해서 위치값과 위치에 있는 값을 한번에 얻어서 풀었습니다. 첫 층에는 해당 위치에 해당하는 값을 toplist에 넣어주고 그 값과 해당 위치에 relation을 통해 대응하는 위치의 값이 아닌 값중 가장 큰 값을 sumlist에 넣어주었습니다. 이것이 첫 번째 입력에 대한 결과이고 그 다음부터는 toplist에 저장된 값들과 그 값들의 위치를 이용하여 같은 방식으로 차근차근 채워넣어주었습니다. 반복을 끝낸 뒤의 sumlist[-1]에는 각 시작이 1일때, 2일때, 3일때.. 의 최종 합이 들어있고 그 값중 가장 큰 값을 출력해주면 됩니다.
'Koala - 4기' 카테고리의 다른 글
[BOJ] 1477 휴게소 세우기 (4) | 2021.07.26 |
---|---|
[BOJ] 주사위 쌓기 2116 (0) | 2021.07.26 |
[BOJ] 2116 주사위 쌓기 (0) | 2021.07.25 |
[BOJ 1918번] : 후위 표기식 (0) | 2021.07.24 |
[BOJ] 1918 후위표기식 (0) | 2021.07.24 |