구현문제
구현문제는 알고리즘이 어려운 건 아닌데 풀이를 생각하기가 빡세다
총 세 부분으로 나눠서 동작한다.
1. 좌표값이 이동
- 명령에 맞게 좌표값을 이동시킨다. 이 때 배열의 범위를 벗어나는지 체크하고 벗어난다면 움직이지 않는다.
2. 주사위 굴리기
- 명령에 맞게 주사위를 굴려서 주사위 배열을 변화시킨다.
3. 굴린 주사위의 바닥면과 지도 점수 값을 확인하여 값을 업데이트
지도값을 기준으로 지도값이 0이면 지도[x][y] = 주사위 바닥면
그렇지 않으면 주사위바닥면 = 지도[x][y]; 지도[x][y] = 0
1과 3은 쉽지만 2가 좀 까다롭다.
처음에 제시된 주사위 전개도를 중심으로 명령에 맞게 전개도를 바꾸어본다.
그리고 주사위 전개도를 배열에 옮겨서 dice[0]은 주사위 윗면,
dice[2]는 주사위 바닥면에 위치하게 만든다.
#include <stdio.h>
#include <algorithm>
using namespace std;
int n, m, x, y, k;
int arr[20][20];
int dirx[5] = {0, 0, 0, -1, 1};
int diry[5] = {0, 1, -1, 0, 0};
int dice[6] = {0, 0, 0, 0, 0, 0};
void RolltheDice(int order)
{
if (order == 1)
{
swap(dice[0], dice[4]);
swap(dice[2], dice[5]);
swap(dice[4], dice[5]);
}
else if (order == 2)
{
swap(dice[0], dice[5]);
swap(dice[2], dice[4]);
swap(dice[4], dice[5]);
}
else if (order == 3)
{
int tmp = dice[3];
for (int i = 2; i > -1; i--)
{
dice[i + 1] = dice[i];
}
dice[0] = tmp;
}
else if (order == 4)
{
int tmp = dice[0];
for (int i = 1; i < 4; i++)
{
dice[i - 1] = dice[i];
}
dice[3] = tmp;
}
}
int main(void)
{
scanf("%d%d%d%d%d", &n, &m, &x, &y, &k);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
scanf("%d", &arr[i][j]);
}
}
for (int i = 0; i < k; i++)
{
int order;
scanf("%d", &order);
if (x + dirx[order] < 0 || y + diry[order] < 0 || x + dirx[order] > n - 1 || y + diry[order] > m - 1)
{
continue;
}
x += dirx[order], y += diry[order];
RolltheDice(order);
printf("%d\n", dice[0]);
if (arr[x][y] == 0)
{
arr[x][y] = dice[2];
}
else
{
dice[2] = arr[x][y];
arr[x][y] = 0;
}
}
return 0;
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 15684] 사다리 조작 (0) | 2020.12.17 |
---|---|
[백준 14503] 로봇 청소기 (0) | 2020.12.17 |
[백준 15686] 치킨 배달 (0) | 2020.12.16 |
[백준 15683] 감시 (0) | 2020.12.16 |
[백준 2012] 등수 매기기 (0) | 2020.12.16 |
댓글