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

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지

www.acmicpc.net

구현 문제다. 주사위의 회전 방향을 생각하면서 문제를 풀면 간단하게 풀 수 있다.

 

풀이

주사위를 6칸짜리 배열로 할당하여 순서대로 주사위의 윗면, 북, 동, 서, 남, 바닥면으로 할당한 뒤 입력되는 방향에 맞게 주사위 원소들을 이동하였다. 즉 주사위 면은 가만히 있고, 주사위에 적힌 숫자가 회전하는 개념으로 문제를 풀었다. 

 

정답 코드

import Foundation
let info = readLine()!.split(separator: " ").map{Int($0)!}
var n = info[0], m = info[1], x = info[2], y = info[3], k = info[4]
var map = Array(repeating: Array(repeating:0, count:m) ,count:n)
var dice = [0,0,0,0,0,0]
for i in 0..<n{
let numbers = readLine()!.split(separator: " ").map{Int($0)!}
for k in 0..<m{
map[i][k] = numbers[k]
}
}
func move(dir:Int){
switch dir{
case 1:
if y+1 < m{
y += 1
let temp = dice[0]
dice[0] = dice[3]
dice[3] = dice[5]
dice[5] = dice[2]
dice[2] = temp
if map[x][y] == 0{
map[x][y] = dice[5]
}else{
dice[5] = map[x][y]
map[x][y] = 0
}
print(dice[0])
}
case 2:
if y-1 >= 0{
y -= 1
let temp = dice[5]
dice[5] = dice[3]
dice[3] = dice[0]
dice[0] = dice[2]
dice[2] = temp
if map[x][y] == 0{
map[x][y] = dice[5]
}else{
dice[5] = map[x][y]
map[x][y] = 0
}
print(dice[0])
}
case 3:
if x-1 >= 0{
x -= 1
let temp = dice[5]
dice[5] = dice[1]
dice[1] = dice[0]
dice[0] = dice[4]
dice[4] = temp
if map[x][y] == 0{
map[x][y] = dice[5]
}else{
dice[5] = map[x][y]
map[x][y] = 0
}
print(dice[0])
}
case 4:
if x+1 < n{
x += 1
let temp = dice[0]
dice[0] = dice[1]
dice[1] = dice[5]
dice[5] = dice[4]
dice[4] = temp
if map[x][y] == 0{
map[x][y] = dice[5]
}else{
dice[5] = map[x][y]
map[x][y] = 0
}
print(dice[0])
}
default:
break
}
}
let dirs = readLine()!.split(separator: " ").map{Int($0)!}
for dir in dirs{
move(dir: dir)
}
view raw 14499.swift hosted with ❤ by GitHub

'Problem Solving > BOJ' 카테고리의 다른 글

[14500] 테트로미노  (0) 2022.11.14
[21610] 마법사 상어와 비바라기  (0) 2022.11.11
[21608] 상어 초등학교  (0) 2022.11.09
[14891] 톱니바퀴  (0) 2022.11.09
[13335] 트럭  (0) 2022.11.07

+ Recent posts