<Baekjoon> #14499 주사위 굴리기(Rolling dice) c++

Google 아니고 Joogle·2022년 2월 27일
0

SAMSUNG SW Test

목록 보기
13/39
post-thumbnail

#14499 주사위 굴리기
참고

✍문제 정리

  • 주사위를 굴렸을 때, 이동한 칸에 쓰여 있는 수가 0이면 주사위의 바닥면에 쓰여 있는 수가 복사
  • 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위 바닥면으로 복사되며 칸에 쓰인 수는 0이 된다
  • 주사위가 이동할 때마다 상단에 쓰여 있는 값을 구한다

💬IDEA

  • 먼저 이런 형태의 정육각형을 생각해주고 각 변에 index를 지정한다. (제일 윗 면은 0, 아랫면은 5인 형태)

  • 실제로 주사위를 굴렸을 때 주사위의 index가 가리키고 있는 값이 변한다고 생각한다.
    e.g. dice[3]=A, dice[5]=B, dice[2]=C라는 값이 저장되어 있을 때, 주사위를 오른쪽으로 굴리면 dice[3]=B, dice[5]=C라고 저장된다. 즉 주사위의 index가 가리키고 있는 위치는 변하지 않는다.

  • 문제에서 매번 구해야 하는 '주사위가 이동했을 때 상단에 쓰여있는 값'은 보드 위에 접해 있는 주사위의 면의 값을 뜻하므로 dice[5]를 매번 출력한다

👩‍💻1. Roll Right

  • 오른쪽으로 이동할 때 index에 있는 값의 변화만 보자
  • 먼저 현재 dice 각 면에 저장된 값을 임시 pDice에 복사를 해주고 위의 예시에서 보았듯이 각 면에 저장된 값을 바꾸어 준다.
void rollRight() {
	int pDice[6];
	for (int i = 0; i < 6; i++)
		pDice[i] = dice[i];
	dice[0] = pDice[3];
	dice[2] = pDice[0];
	dice[3] = pDice[5];
	dice[5] = pDice[2];
}

👩‍💻2. Roll Dice

  • 이동할 방향을 입력 받으면 해당 방향으로 이동한 후 좌표를 (ny,nx)로 지정해주고 이 좌표가 범위를 벗어나지 않으면 주사위를 각 방향으로 굴린다
  • 이동한 칸에 수가 있으면 주사위의 아랫면에 복사해주고 칸에 있는 수는 0으로 만들어 준다
  • 칸에 수가 없다면 주사위 아랫면에 있는 수(dice[5])를 이동한 칸에 복사해준다
  • 현재 위치 (r,c)(ny, nx)로 바꾸어 준다
void rollDice() {
	int dir;
	for (int i = 0; i < K; i++) {
		cin >> dir;
		int ny = r + dy[dir-1];
		int nx = c + dx[dir-1];

		if (ny<0 || nx<0 || ny>=N || nx>=M) continue;
		switch(dir - 1) {
       
        //각 방향으로 주사위 굴리기
     
		}

		if (map[ny][nx]) {
			dice[5] = map[ny][nx];
			map[ny][nx] = 0;
		}
		else
			map[ny][nx] = dice[5];
		r = ny;
		c = nx;
		cout << dice[0] << "\n";
	}
}

👀전체코드

#include <iostream>
#include <vector>

using namespace std;

int N, M, K,r,c;
vector<vector<int>> map;
int dice[6];

int dy[] = { 0,0,-1,1 };
int dx[] = { 1,-1,0,0 };

void rollRight() {
	int pDice[6];
	for (int i = 0; i < 6; i++)
		pDice[i] = dice[i];
	dice[0] = pDice[3];
	dice[2] = pDice[0];
	dice[3] = pDice[5];
	dice[5] = pDice[2];
}
void rollLeft() {
	int pDice[6];
	for (int i = 0; i < 6; i++)
		pDice[i] = dice[i];
	dice[0] = pDice[2];
	dice[2] = pDice[5];
	dice[3] = pDice[0];
	dice[5] = pDice[3];
}
void rollUp() {
	int pDice[6];
	for (int i = 0; i < 6; i++)
		pDice[i] = dice[i];
	dice[0] = pDice[4];
	dice[1] = pDice[0];
	dice[5] = pDice[1];
	dice[4] = pDice[5];
}
void rollDown() {
	int pDice[6];
	for (int i = 0; i < 6; i++)
		pDice[i] = dice[i];
	dice[0] = pDice[1];
	dice[1] = pDice[5];
	dice[5] = pDice[4];
	dice[4] = pDice[0];
}
void rollDice() {
	int dir;
	for (int i = 0; i < K; i++) {
		cin >> dir;
		int ny = r + dy[dir-1];
		int nx = c + dx[dir-1];

		if (ny<0 || nx<0 || ny>=N || nx>=M) continue;
		switch(dir - 1) {
		case 0: rollRight(); break;
		case 1: rollLeft(); break;
		case 2: rollUp(); break;
		case 3: rollDown(); break;
		}

		if (map[ny][nx]) {
			dice[5] = map[ny][nx];
			map[ny][nx] = 0;
		}
		else
			map[ny][nx] = dice[5];
		r = ny;
		c = nx;
		cout << dice[0] << "\n";
	}
}
void init() {
	cin >> N >> M >> r >> c >> K;
	map = vector<vector<int>>(N, vector<int>(M));
	for (int i = 0; i < N; i++)
		for (int j = 0; j < M; j++)
			cin >> map[i][j];
}

int main() {
	init();
	rollDice();
	return 0;
}

profile
Backend 개발자 지망생

0개의 댓글