→ Problems

[Algorithm] 백준 - 14499번 주사위 굴리기 (Swift)

Swift librarian 2024. 6. 25. 00:22

문제 소개

주사위를 어떻게 굴릴것인지가 관건.

문제 풀이

이렇게 주사위가 동서남북으로 굴러간것을 표시하면 이렇게 된다. [위, 북, 동, 서, 남, 아래] 순으로 표시하면 위처럼 나타낼 수 있다. 나머지는 구현문제이다.

import Foundation

let nmxyk = readLine()!.components(separatedBy: " ").map { Int($0)! }
let (n, m, x, y, k) = (nmxyk[0], nmxyk[1], nmxyk[2], nmxyk[3], nmxyk[4])
var map = Array(repeating: [Int](), count: n)

for i in 0..<n {
    let input = readLine()!.components(separatedBy: " ").map { Int($0)! }
    map[i] = input
}

let cmds = readLine()!.components(separatedBy: " ").map { Int($0)! }

let ds = [(0, 1), (0, -1), (-1, 0), (1, 0)]
var loc: (i: Int, j: Int) = (x, y)
var dice = [0, 0, 0, 0, 0, 0]

for cmd in cmds {
    let ni = loc.i + ds[cmd-1].0
    let nj = loc.j + ds[cmd-1].1
    
    if 0..<n ~= ni && 0..<m ~= nj {
        switch cmd {
        case 1:
            dice = [dice[3], dice[1], dice[0], dice[5], dice[4], dice[2]]
        case 2:
            dice = [dice[2], dice[1], dice[5], dice[0], dice[4], dice[3]]
        case 3:
            dice = [dice[4], dice[0], dice[2], dice[3], dice[5], dice[1]]
        case 4:
            dice = [dice[1], dice[5], dice[2], dice[3], dice[0], dice[4]]
        default: break
        }
        
        if map[ni][nj] == 0 {
            map[ni][nj] = dice[5]
        } else {
            dice[5] = map[ni][nj]
            map[ni][nj] = 0
        }
        print(dice[0])
        loc = (ni, nj)
    }
}