본문 바로가기

ALGORITHM_PRACTICE

백준 14499번: 주사위 굴리기

백준 14499번: 주사위 굴리기

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마

www.acmicpc.net

 

주사위를 지도위에 굴려서 이동할때마다 주사위의 윗면 값을 출력하는 문제이다.

난이도는 어렵지 않은데 x, y좌표 값이 row, col이 내 생각과는 반대로 되어있어서 주의를 했어야했다.

그리고 자꾸 알수없는 예외사항도 생겼는데, 결국엔 코드를 싹 갈아엎고 새로 다시 짰다

테스트케이스는 다 통과했는데 예외사항을 못찾아서 화가났던 문제이다.

 

문제는 다음과 같은 방식으로 해결했다.

 

1. 주사위는 문제에 나와있는 주사위표를 쓰기 위해 크기가 7인 배열로 선언하였 1을 윗면으로 2345가 옆면 6을 아랫면으로 설정

2. 주사위를 굴릴때마다 명령값(command)과 현재 주사위의 위치에서 명령값으로 이동했을 때 맵(field)을 벗어나는지 체크

3. 맵을 벗어나면 반복문을 continue 아니라면 명령값에 따라 올바른 right, left, up, down 함수가 실행되어 주사위 값이 변한다.

4. 변한 dice의 밑면 값과 이동한 맵(field)의 값을 체크하여 문제에 나와있는 조건대로 값을 변환시켜 준다.

5. 맨 윗면 값을 출력후 x와 y값을 변환

 

#include<iostream>
#define MAPSIZE 20
#define NUMBER_OF_COMMAND 1000
using namespace std;

int field[MAPSIZE][MAPSIZE];
int command;
int dice[7];
int dirX[] = {0,0,-1,1};
int dirY[] = {1,-1,0,0};

void right()
{
    int cloneDice[7];
    copy(dice, dice+7, cloneDice);
    dice[1] = cloneDice[4];
    dice[4] = cloneDice[6];
    dice[6] = cloneDice[3];
    dice[3] = cloneDice[1];
}
void left()
{
    int cloneDice[7];
    copy(dice, dice+7, cloneDice);
    dice[1] = cloneDice[3];
    dice[3] = cloneDice[6];
    dice[6] = cloneDice[4];
    dice[4] = cloneDice[1];
}
void up()
{
    int cloneDice[7];
    copy(dice, dice+7, cloneDice);
    dice[2] = cloneDice[1];
    dice[6] = cloneDice[2];
    dice[5] = cloneDice[6];
    dice[1] = cloneDice[5];
}
void down()
{
    int cloneDice[7];
    copy(dice, dice+7, cloneDice);
    dice[5] = cloneDice[1];
    dice[6] = cloneDice[5];
    dice[2] = cloneDice[6];
    dice[1] = cloneDice[2];
}

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

    int N, M, x, y, K;
    int dx, dy;
    cin >> N >> M >> x >> y >> K;
    for(int i = 0; i < N; i++){
        for(int j = 0; j < M; j++){
            cin >> field[i][j];
        }
    }
    for(int i = 0; i < K; i++){
        cin >> command;
        
        dx = x + dirX[command-1];
        dy = y + dirY[command-1];
        if(dx < 0 || dx >= N || dy < 0 || dy >= M) continue;
        //동
        if(command == 1){
            right();
        }
        //서
        if(command == 2){
            left();
        }
        //북
        if(command == 3){
            up();
        }
        //남
        if(command == 4){
            down();
        }
        if(field[dx][dy] == 0) field[dx][dy] = dice[6];
        else{
            dice[6] = field[dx][dy];
            field[dx][dy] = 0;
        }
        cout << dice[1] << "\n";
        x = dx;
        y = dy;
    }
    return 0;
}

'ALGORITHM_PRACTICE' 카테고리의 다른 글

백준 3197번: 백조의 호수  (0) 2019.06.21
백준 15656번: N과 M (7)  (0) 2019.06.20
백준 5014번: 스타트 링크  (0) 2019.06.20
백준 6593번: 상범 빌딩  (0) 2019.06.20
백준 1629번: 곱셈  (0) 2019.06.20