[백준] 14499번: 주사위
2022. 10. 10. 01:00ㆍTIL💡/Algorithms
https://www.acmicpc.net/problem/14499
지금까지 풀었던 문제와 완전히 다른 유형이다..어려운 구현 그 자체이다.
우선 주사위 굴러가는 걸 어떻게 구현할 것인가가 관건이다.
이 때 잘 생각해보면 주사위를 공중에 띄워놓고 면들만 굴려서 바꿔치기 한다고 생각하면 문제가 간단해진다.
그래서 크게 남북/ 동서로 회전 방향을 2가지로 나뉘어 놓는다.
그리고 면들을 각 방향에 맞춰 회전한다.
앞면은 임의로 정하면 된다.
여기까지는 잘했는데, 몇몇 테스트 케이스는 통과를 하지 못했다.
알고보니 큰 실수를 했었다.
여기서 큰 행위는 1) 주사위의 위치를 옮기는 것 2) 주사위를 굴리는 것이다.
그런데 반드시 주사위의 위치를 옮긴 후, 유효한 위치인 경우에만 주사위를 굴려야 한다.
왜냐하면 문제에 의하면 범위를 벗어난 이동은 무시하라고 하기 때문이다.
#include <iostream>
#include <vector>
using namespace std;
int N, M, K;
int x, y;
vector<int> dice(6, 0);
int dr[4] = {0, 0, -1, 1};
int dc[4] = {1, -1, 0, 0};
void roll_dice(int cmd) {
int dice0 = dice[0], dice1 = dice[1], dice2 = dice[2];
int dice3 = dice[3], dice4 = dice[4], dice5 = dice[5];
// 동쪽
if(cmd == 1) {
dice[0] = dice1;
dice[1] = dice2;
dice[2] = dice5;
dice[5] = dice0;
}
// 서쪽
else if(cmd == 2) {
dice[0] = dice5;
dice[1] = dice0;
dice[2] = dice1;
dice[5] = dice2;
}
// 북쪽
else if(cmd == 3) {
dice[3] = dice5;
dice[1] = dice3;
dice[4] = dice1;
dice[5] = dice4;
}
// 남쪽
else {
dice[3] = dice1;
dice[1] = dice4;
dice[4] = dice5;
dice[5] = dice3;
}
}
pair<int,int> move(int x, int y, int cmd) {
int nx = x + dr[cmd - 1];
int ny = y + dc[cmd - 1];
return make_pair(nx, ny);
}
bool inside(int x, int y) {
return x >= 0 && x < N && y >= 0 && y < M;
}
int main() {
cin >> N >> M >> x >> y >> K;
vector<vector<int>> map(N, vector<int>(M));
int cmd;
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 >> cmd;
auto new_pos = move(x, y, cmd);
if(!inside(new_pos.first, new_pos.second)) {
continue;
}
x = new_pos.first;
y = new_pos.second;
// 옮긴 후에 주사위 굴려야함
// 만약 옮긴 결과가 범위를 벗어나면 무효처리해야 하기 때문
roll_dice(cmd);
if(map[x][y] == 0) {
map[x][y] = dice[1];
}
else {
dice[1] = map[x][y];
map[x][y] = 0;
}
cout << dice[5] << '\n';
}
}
첫 문제 풀었는데 하루 다 갔다..
시험까지 남은 일주일이 걱정이다..ㅠ
'TIL💡 > Algorithms' 카테고리의 다른 글
[백준] 14891번: 톱니바퀴 (0) | 2022.10.10 |
---|---|
[백준] 14503번: 로봇 청소기 (0) | 2022.10.10 |
[백준] 22866번: 탑 보기 (0) | 2022.10.09 |
[백준] 2668번: 숫자고르기 with unique DFS (0) | 2022.10.08 |
[파이썬] queue (0) | 2022.10.07 |