본문 바로가기

PS/BaekJoon

[C++/23796] 2,147,483,648 게임


 단순히 기록용 입니다... 어떻게 풀었는가 생각도 다시 해보고 그러니까 아마도 도움은 안되실 것 같습니다.


2,147,483,648 게임이란, 2048 게임과 같고, 숫자의 범위만 int의 마지막값입니다. 그래서 unsigned int로 범위를 정해놓고 문제를 해결했습니다. 물론 입력값으로 저 값이 나오진 않지만 혹시나 몰라서 타입을 unsigned로 정해놨습니다.

문제를 해결할때, U,L,D,R 로 4가지를 구현하는 것 또한 좋은 방법입니다. 하지만, 해당 문제를 해결하면서 4가지를 전부 구현하는 것 보다는 배열을 시계방향으로 돌려가면서 하나의 방식으로만 이동을 시킨다면? 좀 더 문제 해결에 문제가 없을 것 같았습니다. 구현시 어느 부분에서 문제가 발생했는지 4개를 살피는 것보다는 더 나으니까요. 해당 문제의 코드입니다.

#include<iostream>
#include<cstring>

#define MAX 8
using namespace std;

unsigned int board[MAX][MAX];
char order;

void init() {
	
	for(int i = 0; i < 8; i++){
		for(int j = 0; j < 8; j++){
			cin >> board[i][j];
		}
	}
	
	cin >> order;
	
}

void printBoard() {
	
	//cout << "current board status!" << "\n";
	
	for(int i = 0; i < 8; i++){
		for(int j = 0; j < 8; j++){
			cout << board[i][j] << " ";
		}
		cout << "\n";
	} 
	cout << "\n";
	
}

void rotate(int number) {
	
	unsigned int temp[MAX][MAX];
	
	for(int i = 0; i < number; i++){
		
		memset(temp,0,sizeof(temp));	
		
		for(int i = 0; i < 8; i++){
			for(int j = 0; j < 8; j++){
				temp[i][j] = board[8 - 1 - j][i];
			}
		}
		
		memcpy(board, temp, sizeof(board));
		
	}
	
}

void gravity() {
	
	unsigned int temp[MAX][MAX];
	memset(temp,0,sizeof(temp));
	
	for(int i = 0; i < 8; i++){
		
		int curPoint = 7;
		
		for(int j = 7; j >= 0; j--){
			
			if(!board[j][i]) continue;
			else{
				
				unsigned int number = board[j][i];
				
				if(!temp[curPoint][i]){
					temp[curPoint][i] = number;
				} else if(temp[curPoint][i] == number){
					temp[curPoint][i] *= 2;
					curPoint--;
				} else if(temp[curPoint][i] != number){
					curPoint--;
					temp[curPoint][i] = number;
				}
			}
			
		}
	}

	memcpy(board,temp,sizeof(board));
}

void solve(char direction){
	
	if(direction == 'U'){
		rotate(2);
		gravity();
		rotate(2);
		
	} else if(direction == 'D'){
		gravity();
	} else if(direction == 'R'){
		rotate(1);
		gravity();
		rotate(3);
		
	} else if(direction == 'L'){
		rotate(3);
		gravity();
		rotate(1);
	}

	printBoard();
	
}

int main() {
	
	init();
	solve(order);
	
	return 0;
}

'PS > BaekJoon' 카테고리의 다른 글

[C++/28256] 초콜릿 보관함  (0) 2024.06.27
[C++/2115] 갤러리  (0) 2024.06.20
[C++/25565] 딸기와 토마토  (0) 2024.06.19
[C++/5766] 할아버지는 유명해!  (0) 2024.06.17
[C++/1790] 수 이어 쓰기 2  (0) 2024.06.16