-
[백준 14499번 - 주사위 굴리기] C++ 풀이알고리즘/삼성SW역량테스트기출 2021. 9. 19. 04:12728x90반응형
백준 14499번.
사용한 알고리즘
- 구현
- 시뮬레이션
문제에 전개도가 그려져 있는 것에 착안하여.. 전개도를 이용하여 풀어보기로 했다.
이렇게 주사위를 a[4], b[4] 배열에 저장해놓는다. 바닥면은 항상 a[1] (= b[1]) , 윗면은 a[3] (= b[3])로 고정하자.
명령이 1 => 오른쪽 2 => 왼쪽 3 => 위쪽 4 => 아래쪽 이다.
오른쪽으로 주사위를 굴리는 경우, 배열 a에 들어있는 숫자들을 왼쪽 방향으로 하나씩 밀어서 재저장한다.
왼쪽으로 주사위를 굴리는 경우, 배열a에 들어있는 숫자들을 오른쪽 방향으로 하나씩 밀어서 재저장한다.
위쪽으로 주사위를 굴리는 경우, 배열 b에 들어있는 숫자들을 아래쪽 방향으로 하나씩 밀어서 재저장한다.
아래쪽으로 주사위를 굴리는 경우, 배열 b에 들어있는 숫자들을 아래쪽 방향으로 하나씩 밀어서 재저장한다.
map[x][y] == 0 이면 주사위에 씌여진 숫자를 지도에 쓰고, 주사위의 바닥면은 0으로 만든다.
주사위의 바닥면이 0이면 map[x][y] 를 주사위 바닥면에 쓰고, 지도 해당칸은 0으로 만든다.
움직이는 방향이 지도에서 벗어나면 해당 명령은 무시한다.
완성된 코드
#include <stdio.h> #include <vector> using namespace std; int n, m, x, y, k; vector<int> orders; vector<vector<int>> map; int a[4] = {0,0,0,0}; int b[4] = {0,0,0,0}; int main() { scanf("%d %d %d %d %d", &n, &m, &x, &y, &k); map.assign(n + 1, vector<int>(m + 1, 0)); for(int i = 0; i < n; ++i) { for(int j = 0; j < m; ++j) { scanf("%d", &map[i][j]); } } orders.assign(k + 1, 0); for(int i = 0; i < k; ++i) { scanf("%d", &orders[i]); } // 1 = 오 2 = 왼 3 = 위 4 = 아래 // 항상 a[1]이 바닥, a[3]이 위. for(int i = 0; i < k; ++i) { if (orders[i] == 1 && y + 1 >= m) { continue; } else if (orders[i] == 1) { int temp = a[0]; a[0] = a[1]; a[1] = a[2]; a[2] = a[3]; a[3] = temp; b[1] = a[1]; b[3] = a[3]; y = y + 1; if (map[x][y] == 0) { map[x][y] = a[1]; } else { a[1] = map[x][y]; b[1] = map[x][y]; map[x][y] = 0; } } if(orders[i] == 2 && y - 1 < 0) { continue; } else if (orders[i] == 2) { int temp = a[3]; a[3] = a[2]; a[2] = a[1]; a[1] = a[0]; a[0] = temp; b[1] = a[1]; b[3] = a[3]; y = y - 1; if (map[x][y] == 0) { map[x][y] = a[1]; } else { a[1] = map[x][y]; b[1] = map[x][y]; map[x][y] = 0; } } if (orders[i] == 3 && x - 1 < 0) { continue; } else if (orders[i] == 3) { int temp = b[3]; b[3] = b[2]; b[2] = b[1]; b[1] = b[0]; b[0] = temp; a[1] = b[1]; a[3] = b[3]; x = x - 1; if (map[x][y] == 0) { map[x][y] = a[1]; } else { a[1] = map[x][y]; b[1] = map[x][y]; map[x][y] = 0; } } if (orders[i] == 4 && x + 1 >= n) continue; else if (orders[i] == 4) { int temp = b[0]; b[0] = b[1]; b[1] = b[2]; b[2] = b[3]; b[3] = temp; a[1] = b[1]; a[3] = b[3]; x = x + 1; if (map[x][y] == 0) { map[x][y] = a[1]; } else { a[1] = map[x][y]; b[1] = map[x][y]; map[x][y] = 0; } } printf("%d\n", a[3]); } }
728x90'알고리즘 > 삼성SW역량테스트기출' 카테고리의 다른 글
[백준 14503번 - 로봇 청소기] C++ 풀이 (0) 2021.09.19 [백준 14500번 - 테르로미노] C++ 풀이 (0) 2021.09.19 [백준 12100번 - 2048(Easy)] C++ 풀이 (0) 2021.09.18 [백준 14501번 - 퇴사] C++ 풀이 (0) 2021.09.18 [백준 14502번 - 연구소] C++ 풀이 (0) 2021.09.18