반응형
A형 필수 알고리즘을 체계적으로 배우고 싶다면? (인프런 바로가기)
https://www.codetree.ai/training-field/frequent-problems/problems/cube-rounding
정육면체 굴리기 문제 풀이는 BOJ 14499 : 주사위 굴리기와 같다.
#include <stdio.h>
#define MAX (20+5)
int T;
int N, M, X, Y, K;
int MAP[MAX][MAX];
int command[1000 + 50];
typedef struct st
{
int up;
int left; int top; int right;
int down;
int bottom;
}CUBE;
CUBE cube;
int dr[] = { 0, 0, 0, -1, 1 };
int dc[] = { 0, 1, -1, 0, 0 };
void moveEast()
{
int tmp[6] = { cube.up, cube.left, cube.top, cube.right, cube.down, cube.bottom };
cube.top = tmp[1];
cube.right = tmp[2];
cube.bottom = tmp[3];
cube.left = tmp[5];
}
void moveWest()
{
int tmp[6] = { cube.up, cube.left, cube.top, cube.right, cube.down, cube.bottom };
cube.top = tmp[3];
cube.right = tmp[5];
cube.bottom = tmp[1];
cube.left = tmp[2];
}
void moveNorth()
{
int tmp[6] = { cube.up, cube.left, cube.top, cube.right, cube.down, cube.bottom };
cube.up = tmp[2];
cube.top = tmp[4];
cube.down = tmp[5];
cube.bottom = tmp[0];
}
void moveSouth()
{
int tmp[6] = { cube.up, cube.left, cube.top, cube.right, cube.down, cube.bottom };
cube.up = tmp[5];
cube.top = tmp[0];
cube.down = tmp[2];
cube.bottom = tmp[4];
}
void input()
{
scanf("%d %d %d %d %d", &N, &M, &X, &Y, &K);
for (int r = 0; r < N; r++)
for (int c = 0; c < M; c++)
scanf("%d", &MAP[r][c]);
for (int i = 0; i < K; i++) scanf("%d", &command[i]);
}
void output()
{
for (int r = 0; r < N; r++)
{
for (int c = 0; c < M; c++)
printf("%d ", MAP[r][c]);
putchar('\n');
}
putchar('\n');
for (int i = 0; i < K; i++) printf("%d ", command[i]);
putchar('\n');
}
void outputDice()
{
printf(" %d\n", cube.up);
printf("%d %d %d\n", cube.left, cube.top, cube.right);
printf(" %d\n", cube.down);
printf(" %d\n", cube.bottom);
putchar('\n');
}
int main(void)
{
// scanf("%d", &T);
T = 1;
for (int tc = 1; tc <= T; tc++)
{
input();
for (int i = 0; i < K; i++)
{
int cmd = command[i];
/* 바깥으로 나가게 되는 경우 */
if (X + dr[cmd] < 0 || X + dr[cmd] > N - 1
|| Y + dc[cmd] < 0 || Y + dc[cmd] > M - 1) continue;
X = X + dr[cmd];
Y = Y + dc[cmd];
if (cmd == 1) moveEast();
else if (cmd == 2) moveWest();
else if (cmd == 3) moveNorth();
else if (cmd == 4) moveSouth();
/* 이동한 칸이 0이면, 주사위의 바닥면의 수가 복사 */
if (MAP[X][Y] == 0) MAP[X][Y] = cube.bottom;
else /* 0이 아니면, 칸에 쓰여진 수가 바닥면으로 복사 */
{
cube.bottom = MAP[X][Y];
MAP[X][Y] = 0;
}
printf("%d\n", cube.top);
}
}
return 0;
}
반응형
'알고리즘 > [ADV] 삼성 SW 역량 테스트 A형' 카테고리의 다른 글
[코드트리] 테트리스 블럭 안의 합 최대화 하기 (삼성 SW 역량테스트 2017 상반기 오전 1번 문제) (0) | 2024.06.06 |
---|---|
[코드트리] 2048 게임 (삼성 SW 역량테스트 2016 하반기 2번 문제) (0) | 2024.06.06 |
[코드트리] 2개의 사탕 (삼성 SW 역량테스트 2015 하반기 2번 문제) (1) | 2024.06.05 |
[코드트리] 바이러스 검사 (삼성 SW 역량테스트 2015 하반기 1번 문제) (1) | 2024.06.03 |
BOJ 23291 : 어항 정리 (삼성 SW TEST A형) (2) | 2021.11.06 |
댓글