Algorithm/Problems

99클럽 코테 스터디 25일차 TIL + 완전탐색

공부좀하시졍 2024. 11. 22. 00:59

https://www.acmicpc.net/problem/2116

import sys
input = sys.stdin.readline

n = int(input())
dices = [list(map(int, input().split())) for _ in range(n)]

pair = {0:5, 1:3, 2:4, 4:2, 3:1, 5:0}

def findMax(num):
    result = 0
    for i in range(n): # n개의 주사위 1층부터 탐색
        for j in range(6):
            if dices[i][j] == num: # 1층 주사위 바닥 숫자를 알면 윗면 숫자를 알아냄
                oppo = dices[i][pair[j]]
                if num == 6 or oppo == 6:
                    if num == 5 or oppo == 5:
                        result += 4
                    else: 
                        result += 5
                else:
                    result += 6
                num = oppo
                break
    return result
        
answer = 0
for i in range(1, 7):
    answer = max(answer, findMax(i)) # 1층 주사위 i번이 바닥에 있을 때
print(answer)
  • 1층 주사위의 바닥면이 정해지면 주사위를 쌓을 때 아랫면과 윗면이 정해진다.
  • 이때 가장 큰 값이 되기 위해선 6을 더하고 6이 없을 땐 5, 5가 없을 땐 4를 더한다. (6이나 5가 윗면이나 아랫면에 포함될 때)
  • 전개도를 보면 A-F, B-D, C-E로 아랫면이 정해짐과 동시에 짝이되는 윗면을 구할 수 있다.
    • 파이썬 딕셔너리를 이용해 아랫면 번호를 알게되면 윗면을 구할 수 있도록한다. 
  • findMax함수에서 dices 리스트를 완탐하며 주사위 아랫면 숫자를 마주치면 pair 딕셔너리를 이용해 윗면 수를 구한 뒤 
    • 윗면, 아랫면에 6이 있으면 5 , 이때 5가 하나라도 포함되면 4를 더해주고 그 외의 경우에는 6을 더해주도록 한다.
    • 이때, 값을 더했으면 n번째 층의 윗면이 n+1층의 아랫면이 되므로 숫자를 초기화 해준뒤 k 층 주사위의 max값을 더해주고 for문을 마무리 해준다.