문제
필요 지식
- 배열
조심할 것
남쪽과 북쪽으로 움직일 때, 방향벡터만들때 일반적인 방향을 생각하면 안된다.
남쪽은 x쪽으로 1칸 움직이는 것이고, 북쪽은 y쪽으로 -1칸 움직이는 것이다.
해결 방법
어떠한 알고리즘이 쓰이기 보다는 문제 이해가 중요했다.
제일 먼저 문제에서 주어진 것처럼 1이 윗면, 3이 동쪽면, 6이 아랫면인 주사위를 그려본다.
그 후, 그 주사위를 동쪽으로 돌렸을 때, 어떻게 그려지는지, 마찬가지로 서쪽, 북쪽, 남쪽을 돌렸을 때에도 어떻게 그려지는지 한번 그려본다.
그래프로 그려본다면 다음과 같이 그릴 수 있다. 동쪽으로 돌렸을 때 예를 들어보자면 원래 1이 있던 윗면 위치에 4가 가고, 6이 있던 아랫면에 3이 가게 된다.
이 그래프를 배열로 만들 수 있다. 그래서 주사위가 방향을 변경할 때 마다 주사위 윗면부터 아랫면까지 숫자를 다시 재조정하면 된다.
코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
#include <string> | |
using namespace std; | |
int main(){ | |
//주사위 : 문제에 나와있는 순서대로(1,2,3,4,5,6): 1이 윗면 | |
int dice[6] = {0,0,0,0,0,0}; | |
//동서 북남으로 움직이면 1 2 3 4 5 6위치가 각각 어떻게 바뀌는지 | |
//다만, index이므로 각각의 위치에서 1만큼씩 뺌 | |
int move_dice[4][6] = { | |
{3,1,0,5,4,2}, | |
{2,1,5,0,4,3}, | |
{4,0,2,3,5,1}, | |
{1,5,2,3,0,4} | |
}; | |
//방향 : 원위치 동서북남 | |
int dx[5] = {0, 0,0,-1,1}; | |
int dy[5] = {0, 1,-1,0,0}; | |
//입력 | |
int n,m,x,y,k; | |
cin >> n >> m >> x >> y >> k; | |
int board[n][m]; | |
for(int i=0;i<n;i++){ | |
for(int j=0;j<m;j++){ | |
cin >> board[i][j]; | |
} | |
} | |
int command[k]; | |
for(int i=0;i<k;i++){ | |
cin >> command[i]; | |
} | |
int tmp[6]; | |
for(int i=0;i<k;i++){ | |
x = x + dx[command[i]]; | |
y = y + dy[command[i]]; | |
if((0<=x&&x<n)&&(0<=y&&y<m)){ | |
//주사위 방향 바뀌었을 때, 윗면(1)부터 아랫면(6)까지 숫자 바뀐거 저장 | |
for(int j=0;j<6;j++) tmp[j] = dice[j]; | |
for(int j=0;j<6;j++) dice[move_dice[command[i]-1][j]] = tmp[j]; | |
if(board[x][y]==0){ | |
board[x][y] = dice[5]; //보드에 주사위 아랫면수 삽입 | |
} | |
else{ | |
dice[5] = board[x][y]; //주사위 아랫면에 보드 수 삽입 | |
board[x][y] = 0; | |
} | |
cout << dice[0]<<endl; | |
} | |
else{ | |
x = x - dx[command[i]]; | |
y = y - dy[command[i]]; | |
} | |
} | |
return 0; | |
} |
0 댓글