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칸짜리 배열로 할당하여 순서대로 주사위의 윗면, 북, 동, 서, 남, 바닥면으로 할당한 뒤 입력되는 방향에 맞게 주사위 원소들을 이동하였다. 즉 주사위 면은 가만히 있고, 주사위에 적힌 숫자가 회전하는 개념으로 문제를 풀었다.
정답 코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
} |

'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 |