[C++] 백준 #14499 주사위 굴리기
문제 링크
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
풀이
구현 문제다. 별다른 알고리즘 없이 시뮬레이션으로 풀 수 있었다.
(삼성 문제에는 시뮬레이션 문제가 참 많은 것 같다.)
1. 주사위 면
주사위의 면(동, 서, 남, 북, 위, 아래)을 구분하기 위해 dice 배열을 생각했다.
dice 배열의 0번째 인덱스는 위, 1번째는 아래, 2~5번째는 순서대로 동서남북으로 정했다.
2. 이동할 때 주사위 면 변화를 기록할 배열을 생성하기.
주사위 면을 위, 아래, 동, 서, 남, 북으로 놓고 원래 배열을 그려서 대조한 결과, 규칙을 발견할 수 있다.
정리하면 아래 사진과 같은데, 기존의 주사위 면이 1, 2, 3, 4, 5, 6 (코드에서는 0, 1, 2, 3, 4, 5이고 순서대로 위 아래 동 서 남 북이다)이라고 하면,
명령이 1일 때 (동쪽으로 이동) 기존에 4번째 면에 있던 숫자가 1번째 면으로 오고, 3번째 면에 있던 숫자는 2번째 면에, 1번째 면에 있던 숫자는 3번째 면에, 2번째 면에 있던 숫자는 4번째 면에, 5번째와 6번째는 그대로인 것을 알 수 있다.
명령이 2, 3, 4일때도 동일하게 처리하면 된다.
그래서 동, 서, 남, 북으로 이동할 때 주사위 면이 바뀌는 것을 change 배열로 바꾸어 주었다.
change[4][6]으로 이중배열인데,
change[0][0~5]는 동쪽으로 갈 때 dice 배열이 기존에서 달라지는 인덱스를 저장했고,
change[1][0~5]는 서쪽으로 갈 때 dice 배열이 기존에서 달라지는 인덱스를 저장했고,
change[2][0~5]는 북쪽으로 갈 때,
change[3][0~5]는 남쪽으로 갈 때 달라지는 인덱스를 저장했다.
3. 구현하기.
복잡한 시뮬레이션이 끝나고 구현을 했다.
//
// Created by ღ 𝚂𝚑𝚒𝚗𝚎 𝚈𝚎𝚘𝚗 ღ on 2022/07/26.
//
#include <iostream>
using namespace std;
int N, M, x, y, K;
int board[21][21];
int direction[1001];
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
int dice[7];
int change[4][6] = {{3, 2, 0, 1, 4, 5},
{2, 3, 1, 0, 4, 5},
{4, 5, 2, 3, 1, 0},
{5, 4, 2, 3, 0, 1}};
//주사위 정보 바꿈
int changeDice(int dir, int thereX, int thereY) {
int tmp[7] ={0, };
for(int i=0; i<6; i++) {
tmp[i] = dice[i];
}
for(int i=0; i<6; i++) {
dice[i] = tmp[change[dir][i]];
//cout<<"here"<<dice[i];
}
if(board[thereX][thereY] == 0){
board[thereX][thereY] = dice[1];
}
else {
dice[1] = board[thereX][thereY];
board[thereX][thereY] = 0;
}
return dice[0];
}
//보드 위에서 주사위 움직임
bool moveDice(int dir) {
if(x+dx[dir] < 0 || x+dx[dir]>=N || y+dy[dir]<0 || y+dy[dir]>=M)
return false;
else{
x+=dx[dir];
y+=dy[dir];
return true;
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>N>>M>>x>>y>>K;
for(int i=0; i<N; i++){
for(int j=0; j<M; j++) {
cin>>board[i][j];
}
}
for(int i=0; i<K; i++){
int dir;
cin>>dir;
direction[i] = dir-1;
}
bool isOk=true;
for(int i=0; i<K; i++){
isOk = moveDice(direction[i]);
if(isOk) {
cout<<changeDice(direction[i], x, y)<<"\n";
//cout<<x<<y<<"\n";
}
else continue;
}
}