카테고리 없음
백준 14499 주사위 굴리기
중국고대사
2019. 4. 15. 16:44
삼성 코딩 테스트를 치고 와서 다시 마음을 다잡고 알고리즘을 공부하기 시작했다.
하루에 2문제 이상 꼭 꾸준히 푸는 것을 목표로 해야 겠다.
시뮬레이션 문제는 조건에 따라 풀기만 하면 되지만, c++ 숙련도를 높이는 좋은 방법이라고 생각한다.
이번 문제도 시뮬레이션 문제로서, 문제를 잘 이해하고 그에 맞춰 코딩을 하면 된다.
하지만 항상 그렇듯이 바로 코딩을 시작하지 않고, 먼저 생각을 한 후 코딩을 시작했다.
문제를 푸는 핵심은 방향에 따라서 이동하는 코드를 쉽게 하도록 dr, dc 배열을 두는 것이 하나 있다.(dr, dc의 인덱스를 문제에 주어진 방향과 맞추면 더 편하다.)
다음으로 주사위를 돌릴 때, 주사위의 값들을 이어서 바꿔주는 것이다. 4가지 방향이 있으므로, 각각 함수를 만들어 주어서, 코드를 조금 보기 쉽게 해주었다.
아래는 코드이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | #include <iostream> using namespace std; int n, m, x, y, k; int map[20][20]; int ju[6]; //동:1, 서:2, 북:3, 남:4 이기 때문에 그 순서대로 세팅 int dr[4] = { 0,0,-1,1 }; int dc[4] = { 1,-1,0,0 }; void right() { int temp = ju[3]; ju[3] = ju[0]; ju[0] = ju[2]; ju[2] = ju[1]; ju[1] = temp; } void left() { int temp = ju[3]; ju[3] = ju[1]; ju[1] = ju[2]; ju[2] = ju[0]; ju[0] = temp; } void up() { int temp = ju[4]; ju[4] = ju[1]; ju[1] = ju[5]; ju[5] = ju[0]; ju[0] = temp; } void down() { int temp = ju[5]; ju[5] = ju[1]; ju[1] = ju[4]; ju[4] = ju[0]; ju[0] = temp; } int main() { cin >> n >> m >> x >> y >> k; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%d", &map[i][j]); } } for (int i = 0; i < k; i++) { int dir; scanf("%d", &dir); int nr = x + dr[dir - 1]; int nc = y + dc[dir - 1]; if (nc < 0 || nc >= m || nr < 0 || nr >= n)continue; switch (dir) { //동 case 1: right(); break; //서 case 2: left(); break; //북 case 3: up(); break; //남 case 4: down(); } if (map[nr][nc] == 0) { map[nr][nc] = ju[1]; } else { ju[1] = map[nr][nc]; map[nr][nc] = 0; } /*출력(디버깅) printf("\n%d번 째\n",i+1); for (int j = 0; j < 6; j++) { printf("%d ", ju[j]); } printf("\n"); */ x = nr; y = nc; printf("%d\n", ju[0]); } return 0; } | cs |