문제 : https://www.acmicpc.net/problem/14499
[ 알고리즘풀이 ]
특정 알고리즘 기법을 사용해야되는 문제가 아니라, 단순 구현 문제입니다. 주사위를 서쪽, 동쪽, 북쪽, 남쪽으로 굴렸을 때 주사위의 상태 변화를 잘 구현하면 문제를 쉽게 해결할 수 있습니다.
위의 그림과 같이 주사위의 왼쪽, 오른쪽, 뒤쪽, 위쪽, 앞쪽, 아래쪽에 번호를 하나씩 부여하겠습니다. 이 번호대로 dice 배열에 현재 주사위의 상태를 저장할 것입니다.
주사위를 남쪽으로 굴리면 다음과 같은 변화가 생깁니다.
뒤쪽, 위쪽, 앞쪽, 아래쪽에 있던 값들이 한 칸씩 밀려나가는 것을 확인할 수 있습니다.
북쪽으로 굴리면 반대로 다음과 같은 변화가 생깁니다.
동쪽으로 굴리면 다음과 같은 변화가 생깁니다.
서쪽으로 굴리면 다음과 같은 변화가 생깁니다.
이 과정을 각각 외부함수로 구현하고 문제에 나와있는 조건들만 반영해준다며 쉽게 해결할 수 있습니다.
#include<iostream>
using namespace std;
// 주사위는 뒷위앞아래 왼오 순으로.
int N, M, x, y, K, t, map[20][20] = {}, dice[6] = {};
void moveRight() {
int curX = x, curY = y + 1;
if (!(0 <= curY && curY < M))
return;
y = y + 1;
int temp = dice[4];
dice[4] = dice[3];
dice[3] = dice[5];
dice[5] = dice[1];
dice[1] = temp;
if (map[curX][curY] != 0) {
dice[3] = map[curX][curY];
map[curX][curY] = 0;
}
else
map[curX][curY] = dice[3];
cout << dice[1] << '\n';
}
void moveLeft() {
int curX = x, curY = y - 1;
if (!(0 <= curY && curY < M))
return;
y = y - 1;
int temp = dice[4];
dice[4] = dice[1];
dice[1] = dice[5];
dice[5] = dice[3];
dice[3] = temp;
if (map[curX][curY] != 0) {
dice[3] = map[curX][curY];
map[curX][curY] = 0;
}
else
map[curX][curY] = dice[3];
cout << dice[1] << '\n';
}
void moveUp() {
int curX = x - 1, curY = y;
if (!(0 <= curX && curX < N))
return;
//위로 이동.
x = x - 1;
int temp = dice[0];
dice[0] = dice[1];
dice[1] = dice[2];
dice[2] = dice[3];
dice[3] = temp;
if (map[curX][curY] != 0) {
dice[3] = map[curX][curY];
map[curX][curY] = 0;
}
else
map[curX][curY] = dice[3];
cout << dice[1] << '\n';
}
void moveDown() {
int curX = x + 1, curY = y;
if (!(0 <= curX && curX < N))
return;
//아래로 이동.
x = x + 1;
int temp = dice[3];
dice[3] = dice[2];
dice[2] = dice[1];
dice[1] = dice[0];
dice[0] = temp;
if (map[curX][curY] != 0) {
dice[3] = map[curX][curY];
map[curX][curY] = 0;
}
else
map[curX][curY] = dice[3];
cout << dice[1] << '\n';
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> N >> M >> x >> y >> K;
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
cin >> map[i][j];
for (int i = 0; i < K; i++) {
cin >> t;
if (t == 1) moveRight();
else if (t == 2) moveLeft();
else if (t == 3) moveUp();
else moveDown();
}
return 0;
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 3190 : zmija - travelbeeee (0) | 2020.01.25 |
---|---|
[BOJ] 14500 : 테트로미노 - travelbeeee (0) | 2020.01.23 |
[BOJ] 2473 : 세 용액 - travelbeeee (0) | 2020.01.22 |
[BOJ] 2467 : 용액 - travelbeeee (0) | 2020.01.22 |
[BOJ] 2470 : 두 용액 - travelbeeee (0) | 2020.01.22 |