-
[C++] BOJ 14499번: 주사위 굴리기프로그래밍/알고리즘 PS 2020. 11. 4. 11:46
문제 풀이
문제에 주어진 조건을 그대로 시뮬레이션하는 방식으로 문제를 풀었다. 문제를 풀 때에 "지도의 좌표는 (r, c)로 나타내며, r는 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수이다."라고 적힌 부분을 주의 깊게 읽어야 한다. 필자는 이 부분을 무시하여 처음에 코드를 작성할 때에 x가 들어갈 좌표에 y, y가 들어갈 좌표에 x가 들어가도록 구현하는 문제가 발생하였다.
또 "주사위는 지도의 바깥으로 이동시킬 수 없다. 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안 된다."라는 조건도 주의해서 구현해야 한다.
코드
#include <iostream> using namespace std; #define RIGHT 1 #define LEFT 2 #define DOWN 3 #define UP 4 int N, M; int x, y; int K; int map[30][30]; // index: [yp][xp] / yp: 0 ~ M - 1, xp: 0 ~ N - 1 int order[1001]; // index: 0 ~ K - 1 int diceIdxHeight = 0; int diceIdxWidth = 0; int diceHeight[4] = {1, 5, 6, 2}; int diceWidth[4] = {1, 3, 6, 4}; int value[7]; void setDiceBottom() { if (map[y][x] == 0) { map[y][x] = value[diceWidth[(diceIdxWidth + 2) % 4]]; return; } value[diceWidth[(diceIdxWidth + 2) % 4]] = map[y][x]; map[y][x] = 0; } void moveDice(int direction) { int nx = x; int ny = y; switch (direction) { case UP: ny += 1; break; case DOWN: ny -= 1; break; case LEFT: nx -= 1; break; case RIGHT: nx += 1; break; } if (nx < 0 || ny < 0 || nx >= M || ny >= N) return; x = nx; y = ny; switch (direction) { case UP: diceIdxHeight = (diceIdxHeight + 3) % 4; diceWidth[diceIdxWidth] = diceHeight[diceIdxHeight]; diceWidth[(diceIdxWidth + 2) % 4] = diceHeight[(diceIdxHeight + 2) % 4]; break; case DOWN: diceIdxHeight = (diceIdxHeight + 1) % 4; diceWidth[diceIdxWidth] = diceHeight[diceIdxHeight]; diceWidth[(diceIdxWidth + 2) % 4] = diceHeight[(diceIdxHeight + 2) % 4]; break; case LEFT: diceIdxWidth = (diceIdxWidth + 1) % 4; diceHeight[diceIdxHeight] = diceWidth[diceIdxWidth]; diceHeight[(diceIdxHeight + 2) % 4] = diceWidth[(diceIdxWidth + 2) % 4]; break; case RIGHT: diceIdxWidth = (diceIdxWidth + 3) % 4; diceHeight[diceIdxHeight] = diceWidth[diceIdxWidth]; diceHeight[(diceIdxHeight + 2) % 4] = diceWidth[(diceIdxWidth + 2) % 4]; break; } setDiceBottom(); cout << value[diceWidth[diceIdxWidth]] << '\n'; } int main(void) { cin.tie(nullptr); ios::sync_with_stdio(false); cin >> N >> M >> y >> x >> K; for (int yp = 0; yp < N; yp++) for (int xp = 0; xp < M; xp++) cin >> map[yp][xp]; for (int i = 0; i < K; i++) cin >> order[i]; for (int i = 0; i < K; i++) moveDice(order[i]); return 0; }
'프로그래밍 > 알고리즘 PS' 카테고리의 다른 글
[C++] BOJ 1941번: 소문난 칠공주 (0) 2020.11.14 [C++] BOJ 14891번: 톱니바퀴 (0) 2020.11.13 [C++] BOJ 15686번: 치킨 배달 (0) 2020.10.29 [C++] BOJ 12100번: 2048 (Easy) (0) 2020.10.28 [C++] BOJ 18808번: 스티커 붙이기 (0) 2020.10.24