티스토리 뷰

Algorithm/BOJ

[14499] 주사위 굴리기

JayStevency 2017. 4. 15. 01:26

시간 제한

메모리 제한제출정답맞은 사람정답 비율
2 초512 MB184853844333.258%

문제

크기가 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로 주어진다.

출력

이동할 때마다 주사위의 윗 면에 써 있는 수를 출력한다. 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안된다.


문제 풀이 :

문제에서 가장 핵심은 주사위를 굴릴때 상태를 어떻게 표현하는가 였습니다. 우선 주사위의 Up(윗면): 1 , Back(뒷면) : 2, Right(오른쪽면) : 3, Left(왼쪽면) : 4, Front(앞면) : 5, Bottom(아랫면) : 6 이라 하겠습니다.

그리고 int dice[7]로 주사위 상태를 나타내는 변수를 선언 합니다. 이때 배열의 인덱스는 면의 위치를 나타내고 값은 복사된 숫자를 의미합니다. 

이제 주사위 롤링이 핵심입니다. 몇번의 노가다를 끝으로 주어진 명령을 기준으로 인덱스를 섞어 줍니다. 섞을 때 값을 보존 하기 위해 int dice_clone[7] 에 저장합니다. swap함수는 해당 인덱스에 대한 값 저장 함수 입니다.

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
if(oper == 1){
        swap(1,3);
        swap(3,6);
        swap(6,4);
        swap(4,1);
        swap(2,2);
        swap(5,5);
    }else if(oper == 2){
        swap(1,4);
        swap(4,6);
        swap(6,3);
        swap(3,1);
        swap(2,2);
        swap(5,5);
    }else if(oper == 3){
        swap(5,1);
        swap(1,2);
        swap(2,6);
        swap(6,5);
        swap(3,3);
        swap(4,4);
    }else if(oper == 4){
        swap(5,6);
        swap(6,2);
        swap(2,1);
        swap(1,5);
        swap(3,3);
        swap(4,4);
    }



그리고 board[x][y] == 0 이면 dice의 아랫면 즉 dice[6] 값을 board[x][y] 에 저장하고, 0이 아니면 dice 아랫면에 board[x][y] 값을 저장하고 0으로 바꿔 줍니다.
그리고 윗면 값을 출력 해주면 끝납니다. 
<소스코드>

 












'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 1003번 피보나치 함수  (0) 2017.01.16
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함