본문 바로가기
코딩/백준

알고리즘 - Python / 백준 - 2116번 : 주사위 쌓기

반응형

2116번: 주사위 쌓기 (acmicpc.net)

 

2116번: 주사위 쌓기

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

www.acmicpc.net

 


풀이

  • 주사위가 n개 있고 각 주사위의 윗면과 아랫면이 같도록 맞추어 쌓아 올리고 그때 , 옆면의 수를 모두 더하여 가장 큰 수를 출력하는 문제이다.
  • n이 최대 10,000 이고 , 가장 아래 주사위의 윗면을 컨트롤 하는 것으로 위쪽의 모든 주사위들을 어떻게 세울지 정해지므로 계산 횟수가 크지 않을 것이라 생각하고 특별한 알고리즘을 사용하지 않고 구현해보았다.
  • 가장 밑의 주사위의 윗면이 1 ~ 6 일때의 경우를 모두 살펴보고 그에 따라 세우는 위쪽의 주사위들이 4개의 옆면에서 max 값을 뽑아 한쪽 면에 쭉 나열해 단계의 max합을 통해 합이 전체의 max가 되도록 하였다.

 

import sys

n = int(sys.stdin.readline())
stack = []
for _ in range(n):
  stack.append(list(map(int , input().split())))

def check(stack , ds):
  for i in range(0,6):
    if ds == stack[i]:
      idx = i
      break
  #1 6 / 2 4 / 3 5
  if idx == 0:
    return (max(stack[1],stack[2],stack[3],stack[4]) , stack[5])
  elif idx == 5:
    return (max(stack[1],stack[2],stack[3],stack[4]) , stack[0])
  elif idx == 1:
    return (max(stack[0],stack[2],stack[5],stack[4]) , stack[3])
  elif idx == 3:
    return (max(stack[0],stack[2],stack[5],stack[4]) , stack[1])
  elif idx == 2:
    return (max(stack[0],stack[1],stack[5],stack[3]), stack[4])
  elif idx == 4:
    return (max(stack[0],stack[1],stack[5],stack[3]), stack[2])

maxx = 0
for i in range(1,7):
  next_ds = i
  ans = 0
  for t in range(0,n):
    summ , next_ds = check(stack[t],next_ds)
    ans += summ
  if maxx < ans:
    maxx = ans
print(maxx)

 

 

 

반응형