Algorithm

SwiftUI: 크레인 인형뽑기 게임

songmoro 2023. 12. 18. 05:45
728x90

moves의 원소를 받아 보드의 top부터 내려가며 인형이 연속되는지 검사하는 문제입니다.

 

board의 원소를 검사하면서 인형이 존재하는 top을 검사하고, moves의 인형이 stack의 마지막 원소를 포함하는지 검사하면서 풀었습니다.

 

다른 분 풀이 보니까 n * n 배열이고, 최대 n이 100으로 크지 않아서 revsed → popLast도 좋은 방법인 것 같습니다.

func solution(_ board:[[Int]], _ moves:[Int]) -> Int {
    var stack: [Int] = []
    var top: [Int] = Array(repeating: board.count - 1, count: board.count)
    
    for (i, arr) in board.enumerated() {
        for (j, ele) in arr.enumerated() {
            if ele != 0 {
                top[j] = min(top[j], i)
            }
        }
    }
    
    return moves.reduce(0) {
        if top[$1 - 1] <= board.count - 1 {
            let i = top[$1 - 1], j = $1 - 1
            top[$1 - 1] += 1
            
            if stack.suffix(1).contains(board[i][j]) {
                stack.removeLast()
                return $0 + 2
            }
            else {
                stack.append(board[i][j])
            }
        }
        return $0
    }
}
728x90