코딩테스트

[삼성 sw 역량 테스트 a형] 주사위 굴리기 c++

코앤미 2023. 7. 27. 14:43

해당 문제는 주사위 도면을 고정 시키고, 상,하,좌,우 이동시, 각 숫자가 어느 위치로 옮겨 지는지 하나하나 따져서 무식하게 풀었다.

 

//original
  2
4 1 3
  5
  6

//up
  6
4 2 3
  1
  5

//down
  1
4 5 3
  6
  2

//left
  2
6 3 1
  5
  3
  
//right
  2
1 3 6
  5
  4

 

포인트는 각 도면의 인덱스는 1,2,3,4,5,6 으로 그대로 고정되기에, 1번, 6번 인덱스 내의 값이 각각 바닥, 천장 값으로 고정되고, 각 움직임에 따라 실제 숫자 값만 바꿔주는 것이다.

 

 

정답 코드

#include<iostream>
using namespace std;

// 2
//413
// 5
// 6
int arr[100][100];
int dice[7]; //1: 바닥, 6: 천장

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

int h[4] = { 2,1,5,6 };
int w[3] = { 4,1,3 };

int top = 6;
void up() {
	int tmp = dice[h[3]];
	for(int i=2;i>=0;i--){  //   6 ==5. 5==1. 1==2. 2==6
		dice[h[i+1]] = dice[h[i]];
	}
	dice[h[0]] = tmp;
}
void down() {
	int tmp = dice[h[0]];
	for (int i = 0; i < 3; i++) {  //   
		dice[h[i]] = dice[h[i+1]];
	}
	dice[h[3]] = tmp;
}
void left() {
	int tmp = dice[w[2]];
	for (int i = 1; i >= 0; i--) {  //
		dice[w[i + 1]] = dice[w[i]];
	}
	dice[w[0]] = tmp;
    
	//4,6 swap
	tmp = dice[4];
	dice[4] = dice[6];
	dice[6] = tmp;
}
void right() {
	int tmp = dice[w[0]]; //tmp==4
	for (int i = 0; i < 2; i++) {  //   4,1,3
		dice[w[i]] = dice[w[i + 1]]; //4==1.  1==3
	}
	dice[w[2]] = tmp; //3==4
    
	//3,6 swap
	tmp = dice[3];
	dice[3] = dice[6];
	dice[6] = tmp;

}

int main() {
	int n, m, x, y, k;
	cin >> n >> m >> y >> x >> k;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> arr[i][j];
		}
	}
	int nxt_x = x, nxt_y = y;
	while (k--) {
		int cmd;
		cin >> cmd;
		if (0 > nxt_x+ dx[cmd - 1] || nxt_x+ dx[cmd - 1] >= m || 0 > nxt_y+ dy[cmd - 1] || nxt_y+ dy[cmd - 1] >= n) continue; //맵밖 무시.
		nxt_x += dx[cmd - 1], nxt_y += dy[cmd - 1];
        
		//바닥: 1, 천장: 6
		if (cmd == 1) {
			right();
		}
		if (cmd == 2) {
			left();
		}
		if (cmd == 3) {
			up();
		}
		if (cmd == 4) {
			down();
		}

		//이동 후 계산
		if (arr[nxt_y][nxt_x] == 0) {
			arr[nxt_y][nxt_x] = dice[1];
		}
		else {
			dice[1] = arr[nxt_y][nxt_x];
			arr[nxt_y][nxt_x] = 0;
		}
		cout << dice[6] << endl;
	}
}