Algorithm/백준_생각정리
백준_2116_주사위 쌓기(python)
코친남
2023. 4. 6. 14:39
※ 접근법
주사위 갯수가 최대 만 개였지만 따져야할 주사위 면에 주사위 숫자는 1~6으로 고정돼 있었기 때문에 경위의 수가 많지 않다고 생각해 문제에서 시키는 대로 구현하면 풀릴 것이라고 생각했다.
※ 풀이
(전체적인 관점 : 주사위 윗면 아랫면에 4,5,6이 없다면 옆면으로는 계속 회전시킬 수 있기 때문에 어떻게든 최대인 기둥이 만들어진다. 그렇다면 윗면 아랫면에 6 or 5 or 4가 없는지 확인하고 없다면 elif문으로 걸러서 제일 큰 숫자를 더해준다.
1. 첫 번째 주사위에 윗면을 담당할 숫자는 1~6까지가 있다.
2. 윗면 아랫면에 4,5,6이 없었다면 임의 변수 temp에 6또는 5또는 4를 더해준다.
3. 이것을 마지막 주사위까지 반복해주면 되는 간단한(?) 문제였다.
n = int(input())
data = []
for i in range(n):
data.append(list(map(int,input().split())))
dx = [[0,5],[1,3],[2,4]]
count = 0
for i in range(6): # 첫 주사위에 윗면이 위를 향하는 숫자의 인덱스
temp = 0
up_idx = i
down_idx = 0
for x,y in dx:
if up_idx == x or up_idx == y:
down_idx = (x+y) - up_idx
break
if 6 not in [data[0][up_idx],data[0][down_idx]]:
temp += 6
elif 5 not in [data[0][up_idx],data[0][down_idx]]:
temp += 5
elif 4 not in [data[0][up_idx],data[0][down_idx]]:
temp += 4
for j in range(1,n): # 두 번재 주사위부터 끝까지
down_idx = data[j].index(data[j-1][up_idx])
for x,y in dx:
if down_idx == x or down_idx == y:
up_idx = (x+y) - down_idx
break
if 6 not in [data[j][up_idx],data[j][down_idx]]:
temp += 6
elif 5 not in [data[j][up_idx],data[j][down_idx]]:
temp += 5
else:
temp += 4
count = max(count, temp)
print(count)
※ 회고
할 수 있다.