본문 바로가기
알고리즘/[ADV] 삼성 SW 역량 테스트 A형

[코드트리] 정육면체 굴리기 (삼성 SW 역량테스트 2016 하반기 1번 문제)

by 피로물든딸기 2024. 6. 5.
반응형

 

A형 필수 알고리즘을 체계적으로 배우고 싶다면? (인프런 바로가기)

 

삼성 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;
}
반응형

댓글