link : https://www.acmicpc.net/problem/14499
주사위 굴리기 성공
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 512 MB | 7231 | 2632 | 1978 | 38.535% |
문제
크기가 N×M인 지도가 존재한다. 지도의 오른쪽은 동쪽, 위쪽은 북쪽이다. 이 지도의 위에 주사위가 하나 놓여져 있으며, 주사위의 전개도는 아래와 같다. 지도의 좌표는 (r, c)로 나타내며, r는 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수이다.
2 4 1 3 5 6
주사위는 지도 위에 윗 면이 1이고, 동쪽을 바라보는 방향이 3인 상태로 놓여져 있으며, 놓여져 있는 곳의 좌표는 (x, y) 이다. 가장 처음에 주사위에는 모든 면에 0이 적혀져 있다.
지도의 각 칸에는 정수가 하나씩 쓰여져 있다. 주사위를 굴렸을 때, 이동한 칸에 써 있는 수가 0이면, 주사위의 바닥면에 써 있는 수가 칸에 복사된다. 0이 아닌 경우에는 칸에 써 있는 수가 주사위의 바닥면으로 복사되며, 칸에 써 있는 수는 0이 된다.
주사위를 놓은 곳의 좌표와 이동시키는 명령이 주어졌을 때, 주사위가 이동했을 때 마다 상단에 써 있는 값을 구하는 프로그램을 작성하시오.
주사위는 지도의 바깥으로 이동시킬 수 없다. 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안된다.
입력
첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다.
둘째 줄부터 N개의 줄에 지도에 써 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 써 있는 수는 항상 0이다. 지도의 각 칸에 써 있는 수는 10을 넘지 않는 자연수이다.
마지막 줄에는 이동하는 명령이 순서대로 주어진다. 동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4로 주어진다.
출력
이동할 때마다 주사위의 윗 면에 써 있는 수를 출력한다. 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안된다.
예제 입력 1
4 2 0 0 8 0 2 3 4 5 6 7 8 4 4 4 1 3 3 3 2
예제 출력 1
0 0 3 0 0 8 6 3
예제 입력 2
3 3 1 1 9 1 2 3 4 0 5 6 7 8 1 3 2 2 4 4 1 1 3
예제 출력 2
0 0 0 3 0 1 0 6 0
예제 입력 3
2 2 0 0 16 0 2 3 4 4 4 4 4 1 1 1 1 3 3 3 3 2 2 2 2
예제 출력 3
0 0 0 0
예제 입력 4
3 3 0 0 16 0 1 2 3 4 5 6 7 8 4 4 1 1 3 3 2 2 4 4 1 1 3 3 2 2
예제 출력 4
0 0 0 6 0 8 0 2 0 8 0 2 0 8 0 2
삼성 S/W테스트 기출문제이고, 시뮬레이션을 이용해서 푼 문제이다.
조건들만 잘 고려하면 풀리는 문제이다.
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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | #include <iostream> using namespace std; int main() { int dice[7] = {0}; int map[20][20], N, M, x, y, K; int i, j, direction[1000]; bool yes = true; cin >> N >> M >> x >> y >> K; for (i = 0; i < N; i++) { for (j = 0; j < M; j++) { cin >> map[i][j]; } } for (i = 0; i < K; i++) { cin >> direction[i]; } for (i = 0; i < K; i++) { yes = true; switch (direction[i]) { case 1: if (y + 1 <= M - 1) { y++; dice[0] = dice[1]; dice[1] = dice[4]; dice[4] = dice[6]; dice[6] = dice[3]; dice[3] = dice[0]; if (map[x][y] == 0) map[x][y] = dice[6]; else { dice[6] = map[x][y]; map[x][y] = 0; } } else yes = false; break; case 2: if (y - 1 >= 0) { y--; dice[0] = dice[1]; dice[1] = dice[3]; dice[3] = dice[6]; dice[6] = dice[4]; dice[4] = dice[0]; if (map[x][y] == 0) map[x][y] = dice[6]; else { dice[6] = map[x][y]; map[x][y] = 0; } } else yes = false; break; case 3: if (x - 1 >= 0) { x--; dice[0] = dice[1]; dice[1] = dice[5]; dice[5] = dice[6]; dice[6] = dice[2]; dice[2] = dice[0]; if (map[x][y] == 0) map[x][y] = dice[6]; else { dice[6] = map[x][y]; map[x][y] = 0; } } else yes = false; break; case 4: if (x + 1 <= N - 1) { x++; dice[0] = dice[1]; dice[1] = dice[2]; dice[2] = dice[6]; dice[6] = dice[5]; dice[5] = dice[0]; if (map[x][y] == 0) map[x][y] = dice[6]; else { dice[6] = map[x][y]; map[x][y] = 0; } } else yes = false; break; default: yes = false; } if (yes == true) cout << dice[1] << endl; } return 0; } | cs |
'Programming > BOJ Solutions' 카테고리의 다른 글
[백준 15686번] 치킨배달 (0) | 2018.06.20 |
---|---|
[백준 14502번] 연구소 (0) | 2018.06.20 |
[백준 1405번] 미친 로봇 (0) | 2018.06.19 |
[백준 13458번] 시험 감독 (0) | 2018.06.19 |
[백준 1260번] DFS와 BFS (0) | 2018.06.19 |