되면한다

백준 14499. 주사위 굴리기 (구현) 본문

코딩테스트준비

백준 14499. 주사위 굴리기 (구현)

haeullee 2023. 7. 1. 01:02

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

주사위를 입력값에 따라 지도위에서 굴린다. 입력값으로 주사위를 굴리다가 주사위가 지도 밖으로 나갈 시, 해당 입력값은 무시한다. 

주사위가 도착한 지도 좌표가 0이면, 주사위 바닥 수를 복사해서 지도에 쓴다. 

0이 아니면, 지도 좌표에 쓰인 값을 주사위 바닥에 쓰고, 해당 지도 좌표 값을 0으로 바꾼다. 

 

1. 특징

1) 구현 

 

2.  구현 포인트

1) 주사위를 동서남북으로 굴려서, 현재 주사위 어디 부분에 무슨 숫자가 있는지를 확인해야 한다. 이를 위해 주사위를 전개도 형태로 펴서 사용해야한다. 

 
(0, 1)
 
서쪽
(1, 0)

(1, 1)
동쪽
(1, 2) 
 
(2, 1)
 
  아래
(3, 1)
 

'동', '서'로 이동할 때: 앞 뒤 고정하고 오른쪽/ 왼쪽으로 한칸씩 밀기

'남', '북'으로 이동할 때: 동 서 고정하고 아래/ 위로 한칸씩 밀기

 

3. 코드

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

int n, m, k;
int x, y;
int board[22][22];

int dx[4] = {0, 0, -1, 1}; // 동 서 북 남
int dy[4] = {1, -1, 0, 0};
int dice[4][3];
int direction;

bool dirOverFunc()
{
    int nx = x + dx[direction - 1];
    int ny = y + dy[direction - 1];

    if(nx < 0 || nx >= n || ny < 0 || ny >= m) return false;
    else
    {
        x = nx;
        y = ny;
        return true;
    }
}
void rolldiceFunc()
{
    // 굴리기
    if(direction == 1) //동쪽이면
    {
        int tmp = dice[1][2];
        dice[1][2] = dice[1][1];
        dice[1][1] = dice[1][0];
        dice[1][0] = dice[3][1];
        dice[3][1] = tmp;     
    } 
    if(direction == 2) //서쪽이면
    {
        int tmp = dice[1][0];
        dice[1][0] = dice[1][1];
        dice[1][1] = dice[1][2];
        dice[1][2] = dice[3][1];
        dice[3][1] = tmp; 
    }

    if(direction == 3) //북쪽이면
    {
        int tmp = dice[0][1];
        dice[0][1] = dice[1][1];
        dice[1][1] = dice[2][1];
        dice[2][1] = dice[3][1];
        dice[3][1] = tmp;
       
    }

    if(direction == 4) //남쪽이면
    {
        int tmp = dice[3][1];
        dice[3][1] = dice[2][1];
        dice[2][1] = dice[1][1];
        dice[1][1] = dice[0][1];
        dice[0][1] = tmp;
    }
 
    if(board[x][y] == 0) // 현재 보드 좌표값이 0이면, 주사위 바닥 수 복사해서 지도에 쓰기
    {
        board[x][y] = dice[3][1];
    }
    else
    {
        dice[3][1] = board[x][y];
        board[x][y] = 0;
    }

    cout << dice[1][1] << '\n';
}
int main(void)
{
    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];
        }
    }


    while(k--)
    {
        cin >> direction;
        // 입력된 direction값이 지도를 벗어나는지 판별
        if(dirOverFunc()) //벗어나지 않았따면,
        {
            rolldiceFunc(); // 주사위 굴려서 주사위 바닥에 글씨 쓰거나 지도에 표시, 위에 있는 값 반환
        } 
    }
    
}

'코딩테스트준비' 카테고리의 다른 글

백준 3190. 뱀 (구현)  (0) 2023.07.05
14500. 테트로미노 (구현)  (0) 2023.07.01
백준 15686. 치킨 배달 (구현)  (0) 2023.07.01
백준 11559. Puyo Puyo (구현)  (0) 2023.07.01
백준 15683. 감시 (백트래킹, 구현)  (0) 2023.06.27
Comments