본문 바로가기

Algorithms/Baekjoon OJ

[Baekjoon]14499.주사위 굴리기

14499.주사위 굴리기

http://www.acmicpc.net/problem/14499

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마

www.acmicpc.net


주사위를 굴렸을때 상단에 위치한 값을 출력하는 시뮬레이션 문제다.

 

주사위의 인덱스를 고정시켜놓고 주사위를 네 방향으로  굴렸을때 각 면의 값이 어떻게 바뀌는지를 봐야한다. 먼저 주사위 배열을 정의해야한다. 

dice[] = {상단, 위쪽, 오른쪽, 왼쪽, 아래쪽, 하단}

여기서 주사위를 동쪽(오른쪽)으로 굴리면 원래 왼쪽에 있던 값이 상단값이 된다. 원래 상단에 있던 값은 오른쪽값으로 바뀐다. 이런 방식으로 생각해보면 동, 서 방향으로 굴릴때는 위, 아래쪽에 있는 값은 바뀌지않는다. 또 남, 북 방향으로 굴릴 때는 왼쪽, 오른쪽 값이 바뀌지 않는다. 이처럼 각 면의 값이 어떤 값으로 바뀌는지를 보고 주사위를 굴릴때마다 갱신해주면 된다. 

 

주사위를 굴리기 전에 전 상태를 temp에 먼저 저장하고 굴린 후에 값을 갱신해준다. 

private static void rollDice(int k) { // 1:동, 2:서, 3:북, 4:남

		int[] temp = new int[6];
		for (int i = 0; i < 6; i++) {
			temp[i] = dice[i];
		}

		if (k == 1) {
			dice[0] = temp[3];
			dice[2] = temp[0];
			dice[3] = temp[5];
			dice[5] = temp[2];
		} else if (k == 2) {
			dice[0] = temp[2];
			dice[2] = temp[5];
			dice[3] = temp[0];
			dice[5] = temp[3];
		} else if (k == 3) {
			dice[0] = temp[4];
			dice[1] = temp[0];
			dice[4] = temp[5];
			dice[5] = temp[1];
		} else if (k == 4) {
			dice[0] = temp[1];
			dice[1] = temp[5];
			dice[4] = temp[0];
			dice[5] = temp[4];
		}
	}

<전체코드>

'Algorithms > Baekjoon OJ' 카테고리의 다른 글

[Baekjoon]14503.로봇청소기  (0) 2019.08.01
[Baekjoon]14891.톱니바퀴  (0) 2019.07.29
[Baekjoon]17070.파이프 옮기기1  (0) 2019.07.24
[Baekjoon]1987.알파벳  (0) 2019.07.16
[Baekjoon]14442.벽 부수고 이동하기2  (0) 2019.07.09