ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 - 주사위 굴리기 (14499) [C++]
    문제 풀이/백준 2024. 3. 18. 16:40
    반응형

    이 문제는 시뮬레이션 문제이다.

     

    시뮬레이션 문제 특성상 문제 요구사항이 복잡한 대신 구현만 제대로 되면 정답이 바로 나온다.

     

    주사위를 길이가 6인 배열로 구성하고, 각 인덱스에 대해 실제 위치를 상수로 정해서 가독성을 높였다.

    주사위는 6개 면밖에 없기도 하고, 규칙성을 빠르게 찾아내지 못해 굴리는 방향에 따라 직접 수정을 해주는 방식으로 구현했다.

    #include <iostream>
    #include <vector>
    using namespace std;
    
    #define MAX 20
    #define RIGHT 1
    #define LEFT 2
    #define UP 3
    #define DOWN 4
    
    #define ABOVE 0
    #define BELOW 1
    #define EAST 2
    #define NORTH 3
    #define WEST 4
    #define SOUTH 5
    
    vector<int> dice(6, 0);
    int matrix[MAX][MAX];
    int N, M, K;
    
    pair<int, int> nextPos(int y, int x, int direction) {
    	switch (direction) {
    	case LEFT:
    		x--;
    		break;
    	case RIGHT:
    		x++;
    		break;
    	case UP:
    		y--;
    		break;
    	case DOWN:
    		y++;
    		break;
    	}
    
    	return { y, x };
    }
    
    void moveDice(int direction) {
    	vector<int> result(6, 0);
    
    	switch (direction) {
    	case LEFT:
    		result[ABOVE] = dice[EAST];
    		result[BELOW] = dice[WEST];
    		result[EAST] = dice[BELOW];
    		result[NORTH] = dice[NORTH];
    		result[WEST] = dice[ABOVE];
    		result[SOUTH] = dice[SOUTH];
    		break;
    	case RIGHT:
    		result[ABOVE] = dice[WEST];
    		result[BELOW] = dice[EAST];
    		result[EAST] = dice[ABOVE];
    		result[NORTH] = dice[NORTH];
    		result[WEST] = dice[BELOW];
    		result[SOUTH] = dice[SOUTH];
    		break;
    	case UP:
    		result[ABOVE] = dice[SOUTH];
    		result[BELOW] = dice[NORTH];
    		result[EAST] = dice[EAST];
    		result[NORTH] = dice[ABOVE];
    		result[WEST] = dice[WEST];
    		result[SOUTH] = dice[BELOW];
    		break;
    	case DOWN:
    		result[ABOVE] = dice[NORTH];
    		result[BELOW] = dice[SOUTH];
    		result[EAST] = dice[EAST];
    		result[NORTH] = dice[BELOW];
    		result[WEST] = dice[WEST];
    		result[SOUTH] = dice[ABOVE];
    		break;
    	}
    
    	dice = result;
    }
    
    bool inRange(int y, int x) {
    	if (0 <= y && y < N && 0 <= x && x < M) {
    		return true;
    	}
    
    	return false;
    }
    
    int main() {
    	ios_base::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    
    	int initY, initX;
    
    	cin >> N >> M >> initY >> initX >> K;
    
    	for (int y = 0; y < N; y++) {
    		for (int x = 0; x < M; x++) {
    			cin >> matrix[y][x];
    		}
    	}
    
    	int y = initY;
    	int x = initX;
    	for (int i = 0; i < K; i++) {
    		int command;
    		cin >> command;
    
    		pair<int, int> next = nextPos(y, x, command);
    		
    		if (!inRange(next.first, next.second)) {
    			continue;
    		}
    
    		y = next.first;
    		x = next.second;
    
    		// 1. move dice
    		moveDice(command);
    		
    		// 2. copy
    		if (matrix[next.first][next.second] == 0) {
    			matrix[next.first][next.second] = dice[BELOW];
    		} else {
    			dice[BELOW] = matrix[next.first][next.second];
    			matrix[next.first][next.second] = 0;
    		}
    
    		cout << dice[ABOVE] << '\n';
    	}
    
    	return 0;
    }
    반응형
Designed by Tistory.