Coding Test

<C/C++> BOJ 14499: 주사위 굴리기

Deviloper😈 2022. 3. 30. 21:38

https://www.acmicpc.net/problem/14499

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지

www.acmicpc.net

 

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
#define MAXN 20
#define MAXN2 1000
int dice[4][3] = { 0, };// 주사위면에 적혀있는 숫자
static int dr[] = { 0, 0, 0, -1, 1 };
static int dc[] = { 0, 1, -1, 0, 0 };
int N, M, dice_r, dice_c, K;
int map[MAXN + 5][MAXN + 5];
int cmd[MAXN2 + 5];
void Input(void) {
	cin >> N >> M >> dice_r >> dice_c >> K; // =================실수: dice_c >> dice_r
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cin >> map[i][j];
		}
	}
	for (int i = 0; i < K; i++) {
		cin >> cmd[i];
	}
}

void moveDice(int i) {
	int t;
	switch (i) {
	case 1:
		t = dice[1][0];
		dice[1][0] = dice[3][1];
		dice[3][1] = dice[1][2];
		dice[1][2] = dice[1][1];
		dice[1][1] = t;
		break;
	case 2:
		t = dice[1][0];
		dice[1][0] = dice[1][1];
		dice[1][1] = dice[1][2];
		dice[1][2] = dice[3][1];
		dice[3][1] = t;
		break;
	case 3:
		t = dice[0][1];
		dice[0][1] = dice[1][1];
		dice[1][1] = dice[2][1];
		dice[2][1] = dice[3][1];
		dice[3][1] = t;
		break;
	case 4:
		t = dice[0][1];
		dice[0][1] = dice[3][1];
		dice[3][1] = dice[2][1];
		dice[2][1] = dice[1][1];
		dice[1][1] = t;
		break;
	}
}

void Solve(void) {
	for (int i = 0; i < K; i++) {
		int dir = cmd[i];
		dice_r += dr[dir], dice_c += dc[dir]; // 주사위 위치 변경
		if (dice_r < 0 || dice_r >= N || dice_c < 0 || dice_c >= M) { // 범위 밖
			dice_r -= dr[dir], dice_c -= dc[dir];
			continue;
		}
		moveDice(dir);

		if (map[dice_r][dice_c]) { // 0이 아닌 숫자라면
			dice[3][1] = map[dice_r][dice_c]; // 칸 숫자를 주사위에 복사
			map[dice_r][dice_c] = 0; // 칸에 있는 숫자 삭제
		}
		else { //0인 숫자라면
			map[dice_r][dice_c] = dice[3][1]; // =================실수: 주사위를 칸숫자에 복사
		}
		cout << dice[1][1] << endl;
	}
}
int main(void) {
	Input();
	Solve();
	//for (int i = 0; i < 4; i++) {
	//	for (int j = 0; j < 3; j++) {
	//		printf("%d ", dice[i][j]);
	//	}
	//	printf("\n");
	//}
	return 0;
}

 

 

  •  적어도 두 개 이상 손으로 직접 풀어보면서 문제 뜻 정확히 파악하기
     "주사위는 지도 위에 윗 면이 1이고, 동쪽을 바라보는 방향이 3인 상태로 놓여져 있으며,"
     여기서 지도 위에 윗 면을 지도와 붙어있는 면이라고 생각함.
     하지만 top 을 뜻하는 거였음.

  •  map이 0인 경우와 아닌 경우 from to 정확하게 생각하기

  •  왜 x, y를 세로, 가로라고 해놓은 것인가...!!
     꼼꼼히 읽자. 실수도 실력