백준문제풀이

백준 문제 14499번 주사위 굴리기 문제풀이 c++

노가다 김씨 2022. 4. 10. 10:12

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

 

문제해석

 

먼저 전역 변수로 dice를 선언해주었다 순서는 어떻게 하든 상관없지만 나는 앞 위 뒤 바닥 왼 오 순서대로 작성하였다.

 

현재 주사위의 위치와 방향이 주어지면 방향에 맞게 그 다음의 위치로 주사위를 돌려주고(turn)

다음 그 위치의 지도에 0인가 아닌가에 따라 문제에 설명 되어진 대로 구현한 move함수를 구현하였다.

참고로 난 주사위 바닥면이 dice[3] 이기 때문에 지도로 부터 dice[3]에 복사받거나 dice[3]에서 지도로 복사하였다.

그 후 현재위치를 업데이트하고 주사위의 윗면을 출력하고 종료했다.

참고로 난 주사위의 윗면이 dice[1]이다.

 

또한 방향에 맞게 주사위를 돌려주는 turn함수를 구현하였다.

 

turn함수는 딱히 설명할게 없는게 그냥 dice를 담을 tmp배열을 선언해주고 노가다로 turn 함수를 구현하였다.

 

 

코드

 

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void turn(int d);
void move(int cy, int cx, int d);
bool inside(int ny,int nx);
int dice[6]={0,0,0,0,0,0};//앞 위 뒤 바닥 왼 오
int dy[5]={0,0,0,-1,1};
int dx[5]={0,1,-1,0,0};
int a[20][20];
int n,m,x,y,k;
int main(){
    cout.tie(NULL);
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    cin>>n>>m>>y>>x>>k;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            cin>>a[i][j];
        }
    }
    for(int i=0; i<k; i++)
    {
        int d;
        cin>>d;
        move(y,x,d);
    }
}
void turn(int d){
    int tmp[6];
    if(d==1)
    {
        tmp[3]=dice[5];
        tmp[5]=dice[1];
        tmp[1]=dice[4];
        tmp[4]=dice[3];
        tmp[0]=dice[0];
        tmp[2]=dice[2];
    }
    else if(d==2)
    {
        tmp[1]=dice[5];
        tmp[4]=dice[1];
        tmp[3]=dice[4];
        tmp[5]=dice[3];
        tmp[0]=dice[0];
        tmp[2]=dice[2];
    }
    else if(d==3)
    {
        tmp[1]=dice[0];
        tmp[2]=dice[1];
        tmp[3]=dice[2];
        tmp[0]=dice[3];
        tmp[4]=dice[4];
        tmp[5]=dice[5];
    }
    else if(d==4)
    {
        tmp[3]=dice[0];
        tmp[0]=dice[1];
        tmp[1]=dice[2];
        tmp[2]=dice[3];
        tmp[4]=dice[4];
        tmp[5]=dice[5];
    }

    for(int i=0; i<6; i++)
    {
        dice[i]=tmp[i];
    }
}
void move(int cy, int cx, int d){
    for(int i=1; i<=4; i++)
    {
        if(d==i)
        {
            int ny=cy+dy[i];
            int nx=cx+dx[i];
            if(inside(ny,nx))
            {
                turn(d);
                if(a[ny][nx]==0)
                {
                    a[ny][nx]=dice[3];
                }
                else
                {
                    dice[3]=a[ny][nx];
                    a[ny][nx]=0;
                }
                y=ny; x=nx;
                cout<<dice[1]<<"\n";
            }
        }
    }
}
bool inside(int ny,int nx){
    if(0<=ny&&ny<n&&0<=nx&&nx<m)
    {
        return true;
    }
    else
    {
        return false;
    }
}