고인물을 지양하는 블로그

BOJ 14499 주사위 본문

Algorithms/ACMICPC(백준)

BOJ 14499 주사위

yunjaeGong 2019. 8. 2. 15:51

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개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마

www.acmicpc.net

   2
4 1 3
   5
   6

전개도의 X. Y축을 각각 deque로 구현했다. 겹치는 바닥면은 주사위를 굴린 후 바뀐 X_ax[1], Y_ax[1](바닥면)를 동기화시켜주면 중복 문제는 해결된다.

 

deque의 push_front()/back(), pop_front()/back() 연산을 이용하면 주사위 굴리는 동작을 쉽게 나타낼 수 있다.

#include <iostream>
#include <deque>
using namespace std;
int x,y,N,M,K,dx[]={1,-1,0,0},dy[]={0,0,-1,1};
deque<short> X_ax, Y_ax; // X, Y축
bool bound(int x, int y) {return x>=0&&x<M&&y>=0&&y<N;}
void roll(int op) {
    short y_f=Y_ax.front(), y_b=Y_ax.back();
    switch(op) {
        case 1: { // 동쪽
            X_ax.push_back(y_b); // 주사위 윗면을 오른쪽 면으로
            Y_ax.back() = X_ax.front(); // 주사위 왼쪽 면을 주사위 윗면으로
            X_ax.pop_front(); // 복사된 왼쪽면 삭제
            Y_ax[1] = X_ax[1]; // Y, X축 동기화
            break;
        }
        case 2: { // 서쪽
            X_ax.push_front(y_b);
            Y_ax.back() = X_ax.back();
            X_ax.pop_back();
            Y_ax[1] = X_ax[1];
            break;
        }
        case 3: { // 북쪽
            Y_ax.pop_back();
            Y_ax.push_front(y_b);
            X_ax[1] = Y_ax[1];
            break;
        }
        case 4: { // 남쪽
            Y_ax.pop_front();
            Y_ax.push_back(y_f);
            X_ax[1] = Y_ax[1];
            break;
        }
    }
}

int main() {
    scanf("%d%d%d%d%d",&N,&M,&y,&x,&K);
    short map[N][M], op;
    
    for(int i=0;i<N;++i) // 지도 입력
        for(int j=0;j<M;++j)
            scanf("%hd",&map[i][j]);
            
    for(int i=0;i<3;++i) { // deque(주사위) 초기화
        X_ax.push_back(0);
        Y_ax.push_back(0);
    }
    Y_ax.push_back(0);
    
    for(int i=0;i<K;++i) {
        scanf("%hd",&op);
        int n_x = x+dx[op-1],  n_y = y+dy[op-1];
        if(!bound(n_x,n_y)) continue; // map 볌위를 넘어가면 패스
        
        roll(op); // 주사위 굴리기
        
        if(map[n_y][n_x] == 0) { // map이 0이면
            map[n_y][n_x] = X_ax[1]; // 현재 주사위 바닥 map에 복사

        } else {
            X_ax[1] = map[n_y][n_x]; // map 바닥을 주사위에 복사
            Y_ax[1] = X_ax[1];
            map[n_y][n_x] = 0;
        }
        printf("%d\n",Y_ax.back()); // 주사위 윗면 출력
        x = n_x, y = n_y;
    }
}

 

문제 조건을 잘 읽지 않아(주사위 초기 위치 (row,col), 바닥을 주사위에 복사한 후  map[n_y][n_x] 0으로 대치) 뭐가 틀렸는지 찾는데 장장 한 시간을 소비했다..

'Algorithms > ACMICPC(백준)' 카테고리의 다른 글

BOJ 2213 트리의 독립집합  (0) 2019.08.14
BOJ 14502 연구소  (0) 2019.08.06
BOJ 5568 카드 놓기  (0) 2019.07.26
BOJ 2167 2차원 배열의 합  (0) 2019.07.23
BOJ 1912 연속합  (0) 2019.07.17
Comments