728x90
SMALL
아이디어
명령어 입력 전후를 구분하여 주사위에 새겨질 값을 바꿔야하기 때문에
dice[]배열과 new_dice[]배열 두개를 선언한다.
입력된 명령어가 1,2,3,4인 경우 각각 dice[] 및 지도 arr[x][y] 배열을 조건에 맞게 기록한다.
문제에 힌트가 주어졌다. 위 숫자들을 dice[] 및 new_dice[]의 index라고 생각하자.
new_dice[]라는 지역 변수에 직전의 주사위 값인 dice[]의 값을 기록한다.
그리고 x또는 y의 값을 증감하여 다음에 탐색할 지도의 위치를 찾는다.
이때, 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안 된다. 라고 했으므로
매 명령어마다 실행하려는 x 또는 y의 증감이 지도의 범위를 벗어나는지 체크해야한다.
new_dice[]에 주사위 값을 맞게 기록했다면, 이때의 지도 값인 arr[x][y]가 0인지 아닌지 체크하고
0이라면 -> 주사위의 값을 지도에 기록
0이 아니라면 -> 지도의 값을 주사위에 기록
코드
#include <iostream>
#include <algorithm>
using namespace std;
using ll = long long;
const int MAX = 21;
int N, M, x, y, K, ans = 0;
int arr[MAX][MAX];
int dice[6]; // 밑면:0, 윗면:5
int main(void) {
cin >> N >> M >> x >> y >> K;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> arr[i][j];
}
}
dice[0] = arr[x][y];
for (int i = 0; i < 6; i++) {
dice[i] = 0;
}
while (K--) {
int new_dice[6]; // dice값 변화를 기록하기 위한 임시 배열
copy(dice, dice + 6, new_dice);
int a;
cin >> a; // 명령어 입력 (1~4)
if (a == 1) { // 동쪽
if (y+1 >= M) {
continue;
}
new_dice[0] = dice[2];
new_dice[2] = dice[5];
new_dice[5] = dice[3];
new_dice[3] = dice[0];
++y;
}
else if (a == 2) { // 서쪽으로 이동
if (y-1 < 0) {
continue;
}
new_dice[0] = dice[3];
new_dice[2] = dice[0];
new_dice[5] = dice[2];
new_dice[3] = dice[5];
--y;
}
else if (a == 3) {
if (x-1 < 0) {
continue;
}
new_dice[0] = dice[1];
new_dice[4] = dice[0];
new_dice[5] = dice[4];
new_dice[1] = dice[5];
--x;
}
else if (a == 4) { // 남쪽으로 이동
if (x+1 >= N) {
continue;
}
new_dice[0] = dice[4];
new_dice[5] = dice[1];
new_dice[1] = dice[0];
new_dice[4] = dice[5];
++x;
}
cout << new_dice[5] << '\n'; // 주사위의 윗면은 dice[5]이다.
if (arr[x][y] != 0) {
new_dice[0] = arr[x][y];
arr[x][y] = 0;
}
else {
arr[x][y] = new_dice[0];
}
copy(new_dice, new_dice + 6, dice);
}
return 0;
}
728x90
LIST
'PS > 삼성 SW 역량 테스트 기출' 카테고리의 다른 글
[삼성 SW 역량 기출] 백준 14500 (C++) 테트로미노 (0) | 2022.02.24 |
---|---|
[삼성 SW 역량 기출] 백준 3190 (C++) 뱀 (0) | 2022.02.18 |
[삼성 SW 역량 기출] 백준 13460 (C++) 구슬 탈출 2 (0) | 2022.02.15 |