ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ] 14499번 주사위 굴리기
    알고리즘/BOJ 2020. 7. 11. 13:08

    해당 문제 링크

    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

    아이디어

     

    1, 시뮬례이션 문제

     

    2, 서쪽, 동쪽, 북쪽, 남쪽으로 각각 주사위를 굴릴 경우 주사위의 상태를 저장해 주고 지도의 상태를 갱신하여 준다.

     

    예시)

    만약 주사위를 남쪽으로 굴렸을 경우

    윗쪽 -> 앞쪽으로

    앞쪽 -> 아래쪽으로

    아래쪽 -> 뒷쪽

    뒷쪽 -> 윗쪽

     

    굴린이후 해당 문제의 조건의 맞게 지도 혹은 주사위를 갱신하여 준다.

     

    3, 시간복잡도 O(K)

     

    소스코드

    #include <cstdio>
    using namespace std;
    
    int up = 0;
    int down = 0;
    int front = 0;
    int back = 0;
    int right = 0;
    int left = 0;
    
    int n, m, x, y, k;
    
    int map[20][20];
    
    int move_dice[1000];
    
    //동쪽 움직임
    void east_action() {
    	int temp_up = up;
    	int temp_down = down;
    	int temp_front = front;
    	int temp_back = back;
    	int temp_right = right;
    	int temp_left = left;
    
    	right = temp_up;
    	down = temp_right;
    	left = temp_down;
    	up = temp_left;
    
    
    }
    
    //서쪽 움직임
    void west_action() {
    	int temp_up = up;
    	int temp_down = down;
    	int temp_front = front;
    	int temp_back = back;
    	int temp_right = right;
    	int temp_left = left;
    
    	up = temp_right;
    	left = temp_up;
    	down = temp_left;
    	right = temp_down;
    	
    
    }
    
    //북쪽 움직임
    void north_action() {
    	int temp_up = up;
    	int temp_down = down;
    	int temp_front = front;
    	int temp_back = back;
    	int temp_right = right;
    	int temp_left = left;
    
    	up = temp_front;
    	back = temp_up;
    	down = temp_back;
    	front = temp_down;
    
    }
    
    //남쪽 움직임
    void south_action() {
    	int temp_up = up;
    	int temp_down = down;
    	int temp_front = front;
    	int temp_back = back;
    	int temp_right = right;
    	int temp_left = left;
    
    	front = temp_up;
    	down = temp_front;
    	back = temp_down;
    	up = temp_back;
    }
    
    int main()
    {
    
    	scanf("%d", &n);
    	scanf("%d", &m);
    	scanf("%d", &x);
    	scanf("%d", &y);
    	scanf("%d", &k);
    
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < m; j++) {
    			scanf("%d", &map[i][j]);
    		}
    	}
    
    	for (int i = 0; i < k; i++) {
    		scanf("%d", &move_dice[i]);
    	}
    
    	for (int i = 0; i < k; i++) {
    		//동
    		if (move_dice[i] == 1) {
    			int nx = x;
    			int ny = y + 1;
    
    			if (nx < 0 || nx >= n || ny < 0 || ny >= m) {
    				continue;
    			}
    
    			east_action();
    
    			if (map[nx][ny] == 0){
    				map[nx][ny] = down;
    			}
    			else{
    				down = map[nx][ny];
    				map[nx][ny] = 0;
    			}
    			x = nx;
    			y = ny;
    		}
    		//서
    		else if (move_dice[i] == 2) {
    			int nx = x;
    			int ny = y - 1;
    
    			if (nx < 0 || nx >= n || ny < 0 || ny >= m) {
    				continue;
    			}
    
    			west_action();
    
    			if (map[nx][ny] == 0){
    				map[nx][ny] = down;
    			}
    			else {
    				down = map[nx][ny];
    				map[nx][ny] = 0;
    			}
    			x = nx;
    			y = ny;
    
    		}
    		//북
    		else if (move_dice[i] == 3) {
    			int nx = x - 1;
    			int ny = y;
    			if (nx < 0 || nx >= n || ny < 0 || ny >= m) {
    				continue;
    			}
    
    			north_action();
    			if (map[nx][ny] == 0) {
    				map[nx][ny] = down;
    			}
    			else {
    				down = map[nx][ny];
    				map[nx][ny] = 0;
    			}
    			x = nx;
    			y = ny;
    
    		}
    		//남
    		else if (move_dice[i] == 4) {
    			int nx = x+1;
    			int ny = y;
    
    			if (nx < 0 || nx >= n || ny < 0 || ny >= m) {
    				continue;
    			}
    
    			south_action();
    			if (map[nx][ny] == 0) {
    				map[nx][ny] = down;
    			}
    			else {
    				down = map[nx][ny];
    				map[nx][ny] = 0;
    			}
    			x = nx;
    			y = ny;
    
    		}
    		printf("%d\n", up);
    	}
    
    
    	return 0;
    }
Designed by Tistory.