길민호(ethan.mino)
코딩수첩
길민호(ethan.mino)
전체 방문자
오늘
어제
  • 분류 전체보기 (215)
    • Computer Science (0)
    • Web (6)
      • CSS (0)
      • HTML (0)
    • Node.js (0)
    • Javascript (2)
    • Java (46)
      • Spring (27)
      • Jsp (0)
    • C\C++ (2)
    • Programming (0)
    • AI (0)
    • Database (7)
    • Git (5)
    • Algorithm (119)
      • Stack (0)
      • Queue (0)
      • Linked List (0)
      • Sort (0)
      • Simulation (27)
      • Recursion (0)
      • Backtracking (4)
      • Two Pointer (3)
      • Dynamic Programming (19)
      • Greedy (10)
      • Graph (3)
      • Dijkstra (1)
      • BFS\DFS (8)
      • Floyd (1)
      • MST (4)
      • Tree (4)
      • Binary Search (8)
      • Binary Search Tree (4)
    • IntelliJ (4)
    • Vscode (0)
    • Operating System (0)
    • 후기 (3)
    • 성장일지 (13)
    • 스터디 (7)
    • 설치 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅡ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
길민호(ethan.mino)

코딩수첩

Algorithm/Simulation

[백준 14499번] 주사위 굴리기 (C/C++)

2022. 3. 18. 01:35

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


주사위를 굴리면 굴리는 방향의 숫자가 원형 큐처럼 돌아가고, 다른 방향의 숫자는 영향을 받지 않습니다. 

예를 들어 전개도가 아래와 같을 때, 오른쪽으로 주사위를 굴리면, 4, 1, 3, 6이 원형 큐처럼 돌아갑니다. 위쪽으로 굴리면, 2, 1, 5, 6이 원형 큐 처럼 돌아갑니다. 

  2
4 1 3
  5
  6

따라서 전개도의 4, 1, 3, 6에 해당하는 원형 큐와 2, 1, 5, 6에 해당하는 원형 큐를 이용하여 문제를 해결할 수 있습니다.

 

⚠️ 주의할 점은 두 개의 원형 큐가 주사위 바닥면과 윗면을 공유하기 때문에 방향에 따라 원형 큐를 돌리고 나서, 동기화 해주어야 한다는 것입니다.

 

아래는 전체 코드입니다.

#include <bits/stdc++.h>
using namespace std;

#define x first
#define y second

int board[20][20];
int n, m, x, y, k, op;

int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};

deque<int> col = {0, 0, 0, 0};  // 주사위 전개도의 2, 1, 5, 6에 해당
deque<int> row = {0, 0, 0, 0};  // 주사위 전개도의 4, 1, 3, 6에 해당

pair<int, int> rolling(pair<int, int> pos, int move){ // pos에서 move에 따라 주사위를 굴리는 함수
    int nx = pos.x + dx[move - 1]; int ny = pos.y + dy[move - 1]; // 주사위가 굴러갈 지도 위 위치
    if(nx < 0 || nx >= n || ny < 0 || ny >= m) return pos; // 바깥으로 이동하려는 경우 명령을 무시

    if(move == 1){  // 동
        row.push_back(row.front()); 
        row.pop_front();
    }else if(move == 2){    // 서
        row.push_front(row.back()); 
        row.pop_back();
    }else if(move == 3){    // 남
        col.push_back(col.front()); 
        col.pop_front();
    }else if(move == 4){ // 북
        col.push_front(col.back()); 
        col.pop_back();
    }

    if(move == 1 || move == 2) {col[1] = row[1]; col[3] = row[3];} // 주사위 바닥면과 윗면 동기화
    else {row[1] = col[1]; row[3] = col[3];} // 주사위 바닥면과 윗면 동기화

    pos = {nx, ny}; // pos 업데이트

    
    if(board[pos.x][pos.y] == 0) {  // 이동한 칸에 쓰여있는 수가 0이면
        board[pos.x][pos.y] = row[1];   // 주사위의 바닥면의 수가 칸에 복사된다
    }else {  // 0이 아닌 경우에는 
        // 칸에 쓰여 있는 수가 주사위 바닥면으로 복사된다, 주사위 바닥면 동기화
        col[1] = board[pos.x][pos.y];   
        row[1] = board[pos.x][pos.y];   
        board[pos.x][pos.y] = 0;    // 칸에 쓰여 있는 수가 0이 된다
    }
    cout << row[3] << "\n"; // 주사위 윗면 출력

    return pos; // 주사위의 현재 위치 반환
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m >> x >> y >> k;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++)
            cin >> board[i][j];
    
    pair<int, int> cur = {x, y};

    for(int i = 0; i < k; i++){
        cin >> op;
        cur = rolling(cur, op); // 각 이동에 따라 주사위를 굴림
    }
}

 

아래는 문제 풀이에 사용된 테스트케이스입니다.

2 2 0 0 4
0 2
3 4
4 1 3 2

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

[백준 14503번] 로봇 청소기 (C/C++)  (0) 2022.03.19
[백준 16985번] Maaaaaaaaaze (C/C++)  (0) 2022.03.19
[백준 11559번] Puyo Puyo (C/C++)  (0) 2022.03.17
[백준 15686번] 치킨 배달 (C/C++)  (0) 2022.03.17
[백준 12100번] 2048 (easy) (C/C++)  (0) 2022.03.17
    'Algorithm/Simulation' 카테고리의 다른 글
    • [백준 14503번] 로봇 청소기 (C/C++)
    • [백준 16985번] Maaaaaaaaaze (C/C++)
    • [백준 11559번] Puyo Puyo (C/C++)
    • [백준 15686번] 치킨 배달 (C/C++)
    길민호(ethan.mino)
    길민호(ethan.mino)
    💻 호기심 많은 서버 개발자 길민호입니다.

    티스토리툴바