Swift) 백준 2116번 주사위 쌓기 - G5

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

 

2116번: 주사위 쌓기

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

www.acmicpc.net

 

첫번째 주사위에 따라서 그 위에 쌓여 있는 주사위의 옆면이 결정된다. 주사위의 도면이 주어졌으므로, 첫번째 주사위의 아랫면이 1부터 6까지일때 각 경우를 따져서, 그 위에 주사위의 옆면 시뮬레이션 했다. 주사위 도면에다가, 각 주사위의 윗면과 아랫면을 제거해서 옆면을 구하는 방식으로 풀었다.

 

import Foundation

let n = Int(readLine()!)!
var diceArr: [[Int]] = []
var answer = 0

//페어 AF, BD, CE / 05,13,24

func pairNum(num: Int, diceNum: Int) -> Int {
    let dice = diceArr[diceNum]
    let index = dice.firstIndex(of: num)
    
    if index == 0 {
        return dice[5]
    } else if index == 1 {
        return dice[3]
    } else if index == 2 {
        return dice[4]
    } else if index == 3 {
        return dice[1]
    } else if index == 4 {
        return dice[2]
    } else if index == 5 {
        return dice[0]
    }
    return -1
}

func getSideNumList(underNum: Int, diceNum: Int) -> [Int] {
    let onNum = pairNum(num: underNum, diceNum: diceNum)
    var currentDice = diceArr[diceNum]
    currentDice.remove(at: currentDice.firstIndex(of: underNum)!)
    currentDice.remove(at: currentDice.firstIndex(of: onNum)!)
    
    return currentDice
}

if n != 0 {
    
    for _ in 0..<n {
        let dice = readLine()!.split(separator: " ").map { Int($0)! }
        diceArr.append(dice)
    }
    
    
    
    for i in 1...6 {
        var selectNumList: [[Int]] = []
        selectNumList.append(getSideNumList(underNum: i, diceNum: 0))
        var onNum = pairNum(num: i, diceNum: 0)
        for j in 1...n-1 {
            onNum = pairNum(num: onNum, diceNum: j)
            selectNumList.append(getSideNumList(underNum: onNum, diceNum: j))
        }
        var result = 0
        for num in selectNumList {
            result += num.max()!
        }
        
        answer = max(answer, result)
    }
}
print(answer)