https://www.acmicpc.net/problem/14499
문제 설명
주사위를 굴릴 때마다 주사위의 숫자와 지도의 숫자가 계속해서 바뀌는 문제이다. 단순 구현 문제이므로 조건에 맞추어 주사위를 굴리는 상황을 구한다.
코드 설명
문제 해결 과정은 크게 세 가지로 나뉜다.
- K개의 방향으로 이동하는 것을 구현한다. 만약, 주사위가 이동할 수 없다면 이 명령을 무시한다.
- 입력된 방향으로 주사위를 굴리고 조건에 맞추어 주사위와 지도의 숫자를 변경한다.
- 굴린 주사위의 윗면을 출력한다.
board
는 지도의 숫자를 저장한 이차원 배열이고, dice는 주사위의 전개도를 저장한 이차원 배열이다.
주사위의 이동 방향을 인덱스로 표현하여 dx
, dy
를 정의하였으며, 각 방향에 대해 전개도가 어떻게 변하는 지 그림으로 표현하면 아래와 같다.
이렇게 dice
배열의 원소의 움직임을 토대로, 주사위를 굴리는 것을 시뮬레이션하는 roll
함수에서 임시 이차원 배열 temp
를 사용해 dice
배열의 원소를 변경해주었다.
이후 문제의 조건에 맞게, 이동한 위치의 숫자가 0이라면 밑면(dice[3][1]
)의 값을 복사, 0이 아니라면 밑면에 숫자를 복사 후 지도의 숫자를 0으로 설정하였다.
이동할 방향을 입력으로 받고 해당 위치로 이동하는 roll
함수를 호출하는 main
함수의 for
문에서는, 이동할 수 없는 방향이 입력으로 주어진다면 continue
하는 방식으로 명령을 무시하는 것을 구현하였다.
코드
#include <iostream>
#include <cstring>
using namespace std;
int n, m;
int x, y;
int board[21][21];
int dice[4][3];
// 동 서 북 남
int dx[5] = { 0,0, 0,-1, 1 };
int dy[5] = { 0,1,-1, 0, 0 };
bool isOut(int x, int y) {
return (x < 0 || x >= n || y < 0 || y >= m);
}
// dice 배열을 direction 방향으로 돌렸을 때 조건에 맞게 주사위와 바닥면의 숫자를 수정, 윗면의 값을 반환
// 이동한 바닥면의 좌표 : (nx, ny) 주사위를 굴린 방향 : direction
int roll(int nx, int ny, int direction) {
int temp[4][3];
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++)
temp[i][j] = dice[i][j];
if (direction == 1) { // 동쪽
dice[1][2] = temp[1][1];
dice[1][1] = temp[1][0];
dice[1][0] = temp[3][1];
dice[3][1] = temp[1][2];
}
else if (direction == 2) { // 서쪽
dice[1][0] = temp[1][1];
dice[1][1] = temp[1][2];
dice[1][2] = temp[3][1];
dice[3][1] = temp[1][0];
}
else if (direction == 3) { // 북쪽
dice[0][1] = temp[1][1];
dice[1][1] = temp[2][1];
dice[2][1] = temp[3][1];
dice[3][1] = temp[0][1];
}
else if (direction == 4) { // 남쪽
dice[0][1] = temp[3][1];
dice[1][1] = temp[0][1];
dice[2][1] = temp[1][1];
dice[3][1] = temp[2][1];
}
if (board[nx][ny] == 0)
board[nx][ny] = dice[3][1];
else {
dice[3][1] = board[nx][ny];
board[nx][ny] = 0;
}
return dice[1][1];
}
int main() {
cin >> n >> m >> x >> y;
int k; cin >> k;
memset(dice, 0, sizeof(dice));
for(int i =0 ;i < n; i ++) // x
for (int j = 0; j < m; j++) // y
cin >> board[i][j];
int nx = x, ny = y;
for (int i = 0; i < k; i++) {
int direction; cin >> direction;
if (isOut(nx + dx[direction], ny + dy[direction])) continue;
nx += dx[direction], ny += dy[direction];
cout << roll(nx, ny, direction) << endl;
}
return 0;
}
'Algorithm > Baekjoon' 카테고리의 다른 글
[BOJ/C++] 백준 16988 - Baaaaaaaaaduk2 (0) | 2023.06.20 |
---|---|
[BOJ/C++] 백준 16234 - 인구 이동 (0) | 2023.05.31 |
[BOJ/C++] 백준 3190 - 뱀 (1) | 2023.05.30 |
[BOJ/C++] 백준 28082 - 기계오리 연구 (0) | 2023.05.26 |
[BOJ/C++] 백준 28081 - 직사각형 피자 (0) | 2023.05.26 |