✍문제 정리
먼저 이런 형태의 정육각형을 생각해주고 각 변에 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; }