반응형
1. 문제 설명
2. 구현 아이디어 1 - 맞았습니다!!
주사위의 면이 한 줄짜리면 쉬울텐데 ...! 십자가 모양이라서 주사위 각 면에 있는 수를 어떻게 저장할지 고민되었다.
일단 동서남북으로 굴렸을 때 주사위의 도면 변화를 그려봤다.
주사위의 각 면을 1차원 리스트로 관리할 때, 그림 아래 적은 것처럼 각 면에 적힌 숫자가 어느 면으로 가야할지 정할 수 있다.
그래서 dice라는 원본 리스트를 만들고, 구르는 방향에 따라 원소의 위치를 변경한 newDice 리스트를 만들어 명령마다 dice를 newDice로 갱신해주었다.
나머지는 문제에 나와있는 그대로 코드로 구현하면 된다.
#include <bits/stdc++.h>
using namespace std;
int n, m, x, y, k;
int board[20][20];
vector<int> dice = vector<int>(7);
int command;
// 명령과 index를 맞추기 위해 0번째 원소는 비워둠
int dx[5] = {0, 0, 0, -1, 1};
int dy[5] = {0, 1, -1, 0, 0};
int nx, ny;
vector<int> tumble(int cmd) {
vector<int> newDice = vector<int>(7);
switch (command) {
case 1: // 동
newDice = {0, dice[4], dice[2], dice[1], dice[6], dice[5], dice[3]};
break;
case 2: // 서
newDice = {0, dice[3], dice[2], dice[6], dice[1], dice[5], dice[4]};
break;
case 3: // 북
newDice = {0, dice[5], dice[1], dice[3], dice[4], dice[6], dice[2]};
break;
case 4: // 남
newDice = {0, dice[2], dice[6], dice[3], dice[4], dice[1], dice[5]};
break;
}
return newDice;
}
int main(int argc, char** argv)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
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) {
cin >> command;
nx = x + dx[command];
ny = y + dy[command];
// 바깥으로 이동시키려고 하는 경우 skip
if (nx < 0 || ny < 0 || nx >= n || ny >= m) continue;
// 주사위를 굴린다
dice = tumble(command);
// 칸에 쓰여있는 수가 0이라면 주사위 바닥면에 쓰여 있는 수를 칸에 복사
if (board[nx][ny] == 0) board[nx][ny] = dice[6];
else { // 0이 아니라면
// 칸에 있는 수를 주사위 바닥 면에 복사하고
dice[6] = board[nx][ny];
// 칸에 있는 수는 0이 된다
board[nx][ny] = 0;
}
x = nx;
y = ny;
cout << dice[1] << endl;
}
return 0;
}
반응형