오늘의 문제 | 2116. 주사위 쌓기
import sys
from collections import deque
input=sys.stdin.readline
# 0 1 2 3 4 5
# 5 3 4 1 2 0
n=int(input())
l=deque([[*map(int,input().split())] for i in range(n)])
connect=[5,3,4,1,2,0]
# 시작 지점 6군데를 모두 돌리는 것으로 시작함.
start=l.popleft()
if n==1: print(6)
# 1개면 그냥 가장 큰 수 출력함
else:
maxv=0
# 전체 최고 값
for st in range(6):
# 각 시작점마다의 최고값을 구함
tnum=start[st]
# 가장 머리에 있을 값
bnum=start[connect[start.index(tnum)]]
# 머리에 있는 값 반대편 값(다음에 이어갈 값)
numList=[]
# 각 층마다
numList.append([i for i in range(1,7) if i not in [tnum,bnum]])
for time in range(n-1):
if n%2==0:
tnum=l[time][l[time].index(bnum)]
bnum=l[time][connect[l[time].index(tnum)]]
numList.append([i for i in range(1,7) if i not in [tnum,bnum]])
else:
bnum=l[time][l[time].index(tnum)]
tnum=l[time][connect[l[time].index(bnum)]]
numList.append([i for i in range(1,7) if i not in [tnum,bnum]])
maxNum=sum(map(max,numList))
maxv=max(maxv,maxNum)
print(maxv)
ABCDEF가 각각 순서대로 012345에 대응되어, 해당 숫자들의 반대편에 어떤 알파벳이 들어올지를 먼저 정의했다.
그 이후에, 맨 위에 올라올 수 있는 값을 기준으로 for문을 실행시켜 각 숫자마다 어떤 최댓값을 가질 수 있는지를 계속 갱신해가며 확인하는 방식이다.
사실 리스트 개수가 많아지다보니 시간 초과나 메모리 초과가 나지 않을까 걱정했지만 아까 말했다시피 계속 갱신하는 방식으로 하니 문제가 발생하지 않았다.
오늘의 회고
어제는 검색 찬스를 썼기에 오늘은 정말 쓰지 않고 풀어보고 싶었다. 한번에 맞아서 굉장히 다행일 정도로 코드가 깔끔하지는 않긴 하지만, 그만큼 내가 처음 떠오른 로직이 빈틈없이 잘 작성되었다는 생각도 든다.
'일기장 > 항해99클럽 4기' 카테고리의 다른 글
99클럽 코테 스터디 27일차 TIL: 부분 수열 DP (0) | 2024.11.24 |
---|---|
99클럽 코테 스터디 26일차 TIL: 베스킨라빈스 게임 (0) | 2024.11.22 |
99클럽 코테 스터디 24일차 TIL: 완전 탐색 그래프 탐색 (0) | 2024.11.21 |
99클럽 코테 스터디 23일차 TIL: Python Itertools (1) | 2024.11.19 |
99클럽 코테 스터디 22일차 TIL: 기본 완전 탐색 (0) | 2024.11.18 |