[백준 14499번] 주사위 굴리기

2022. 1. 15. 18:33·알고리즘 문제풀이/백준
반응형

문제 링크: https://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개의 줄에 지

www.acmicpc.net

<문제 풀이> 시뮬레이션

    2

4  1  3

    5

    6

문제에서 나온 주사위를 배열로 표현하면 dice[1] == 윗면, dice[6] == 바닥

 

동쪽으로 굴렸을 때

    2

6   4  1

    5

    3

 

서쪽으로 굴렸을 때

    2

1   3  6

    5

    4

 

북쪽으로 굴렸을 때

    1

4  5  3

    6

    2

 

님쪽으로 굴렸을 때

    6

4  2  3

    1

    5

 

굴리기 전 배열의 값을 temp에 저장해놓고 위에 바뀐 주사위의 상태를 기록하면 됩니다.

배열의 값은 변하지만, 인덱스의 의미는 그대로 주사위의 윗면, 바닥면, 옆면을 의미합니다.

 

<C++ 소스 코드>

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
#include <iostream>
using namespace std;
 
#define EAST 1
#define WEST 2
#define NORTH 3
#define SOUTH 4
 
int N, M, x, y, k;
int board[20][20];
int dice[7]; // 바닥 index = 6
const int dx[5] = { 0, 0, 0, -1, 1 }; // (1, 2, 3, 4) == (동, 서, 북, 남)
const int dy[5] = { 0, 1,-1, 0, 0 };
 
void rotateDice(int dir) {
    int temp[7];
    for (int i = 0; i < 7; i++) temp[i] = dice[i];
    if (dir == EAST) {
        dice[1] = temp[4];
        dice[3] = temp[1];
        dice[4] = temp[6];
        dice[6] = temp[3];
    }
    else if (dir == WEST) {
        dice[1] = temp[3];
        dice[3] = temp[6];
        dice[4] = temp[1];
        dice[6] = temp[4];
    }
    else if (dir == NORTH) {
        dice[1] = temp[5];
        dice[2] = temp[1];
        dice[5] = temp[6];
        dice[6] = temp[2];
    }
    else if (dir == SOUTH) {
        dice[1] = temp[2];
        dice[2] = temp[6];
        dice[5] = temp[1];
        dice[6] = temp[5];
    }
}
 
void move(int dir) {
    int nx = x + dx[dir];
    int ny = y + dy[dir];
    if (nx < 0 || ny < 0 || nx >= N || ny >= M) return; // 주사위는 지도의 바깥으로 이동시킬 수 없다.
    rotateDice(dir); // 주사위 이동
    if (board[nx][ny] == 0) {//이동한 칸에 쓰여 있는 수가 0이면
        board[nx][ny] = dice[6]; //주사의위 바닥면에 쓰여 있는 수가 칸에 복사된다.
    }
    else {
        dice[6] = board[nx][ny]; //칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며,
        board[nx][ny] = 0;  // 칸에 쓰여 있는 수는 0이 된다.
    }
    cout << dice[1]<<'\n';
    x = nx;
    y = ny;
}
 
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    cin >> N >> M >> x >> y >> k;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin>>board[i][j];
        }
    }
    for (int i = 0; i < k; i++) {
        int command; cin >> command;
        move(command);
    }
    return 0;
}
Colored by Color Scripter
cs

 

반응형
저작자표시 (새창열림)

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 2638번] 치즈  (0) 2022.01.17
[백준 16985번] Maaaaaaaaaze  (0) 2022.01.16
[백준 6443번] 애너그램  (0) 2022.01.14
[백준 11559번] Puyo Puyo  (0) 2022.01.13
[백준 15686번] 치킨 배달  (0) 2022.01.09
'알고리즘 문제풀이/백준' 카테고리의 다른 글
  • [백준 2638번] 치즈
  • [백준 16985번] Maaaaaaaaaze
  • [백준 6443번] 애너그램
  • [백준 11559번] Puyo Puyo
슥지니
슥지니
개발 블로그
  • 슥지니
    슥지니의 코딩노트
    슥지니
  • 전체
    오늘
    어제
    • 분류 전체보기 (198)
      • 알고리즘 문제풀이 (158)
        • 백준 (158)
      • 알고리즘 (6)
      • Node.js (2)
        • MongoDB (1)
        • 기타 (1)
      • spring (0)
      • 가상화폐 (1)
        • 바이낸스(Binance) (1)
      • C++ 테트리스 게임 (0)
      • C++ (10)
      • 안드로이드 프로그래밍 (21)
        • 코틀린 (21)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    구현
    코틀린
    Kotlin
    BFS
    코틀린을 활용한 안드로이드 프로그래밍
    백트랙킹
    dfs
    콘솔
    그리디
    다이나믹 프로그래밍
    백준
    알고리즘
    우선순위 큐
    자료구조
    그래프
    dp
    콘솔 테트리스 게임
    C
    C++
    시뮬레이션
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
슥지니
[백준 14499번] 주사위 굴리기
상단으로

티스토리툴바