ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ 23796: 2,147,483,648 게임
    알고리즘 2023. 7. 31. 00:51

    #BOJ 23796: 2,147,483,648 게임

     

    23796번: 2,147,483,648 게임

    호준이는 2048 게임을 발전시킨 2,147,483,648 게임을 하고 있다. 2,147,483,648 게임은 \(8 \times 8\) 크기의 게임판에서 키보드의 방향키를 통해 \(2^k\) (\(1 \le k \le 30\))꼴에 해당하는 정수가 쓰여 있는

    www.acmicpc.net

    #풀이

    2048의 게임의 조금 변형? 버전이다.

     

    그래도 어렵지 않으니까 재밌다!

     

    누가봐도 구현문제이다. 유명한 구현문제인 2048과 비슷하다.

     

    일단 키보드를 누르면 누르는 방향으로 숫자들을 몰아야 한다. 숫자들을 모을 때 같은 숫자가 붙어 있으면 합쳐진다.

     

    이걸 나는 큐를 이용하여 구현했다.

     

    큐에다가 0이 아닌 숫자들을 방향 순서대로 저장하고 뽑을 때 전에 뽑았던 숫자와 동일한지 확인 후 배열에다가 저장했다.

     

    또한 한번 합쳐진 배열은 더 이상 합쳐지지 않기 때문에 전에 뽑았던 숫자를 저장하던 변수를 0으로 초기화한다.

     

    #코드

    #include<bits/stdc++.h>
    
    using namespace std;
    long long board[9][9];
    
    void U(){
    	queue<int> q;
    	for(int i = 1; i <= 8; i++){
    		for(int j = 1; j <= 8; j++){
    			if(board[j][i] == 0) continue;
    			q.push(board[j][i]);
    			board[j][i] = 0;
    		}
    		if(q.empty()) continue;
    		int j = 1;
    		int pre = q.front(); q.pop();
    		board[j][i] = pre;
    		j++;
    		while(!q.empty()){
    			int nxt = q.front(); q.pop();
    			
    			if(pre == nxt){
    				board[j-1][i] = pre * 2L;
    				pre = 0;
    			}
    			else{
    				board[j][i] = nxt;
    				pre = nxt;
    				j++;
    			}
    			
    		}
    	}
    	
    	for(int i = 1; i <=8; i++){
    		for(int j = 1; j <=8; j++){
    			cout << board[i][j] <<' ';
    		}
    		cout << '\n';
    	}
    }
    
    void D(){
    	queue<int> q;
    	for(int i = 8; i >= 1; i--){
    		for(int j = 8; j >= 1; j--){
    			if(board[j][i] == 0) continue;
    			q.push(board[j][i]);
    			board[j][i] = 0;
    		}
    		if(q.empty()) continue;
    		int j = 8;
    		int pre = q.front(); q.pop();
    		board[j][i] = pre;
    		j--;
    		while(!q.empty()){
    			int nxt = q.front(); q.pop();
    			
    			if(pre == nxt){
    				board[j+1][i] = pre * 2L;
    				pre = 0;
    			}
    			else{
    				board[j][i] = nxt;
    				pre = nxt;
    				j--;
    			}
    			
    		}
    	}
    	
    	for(int i = 1; i <=8; i++){
    		for(int j = 1; j <=8; j++){
    			cout << board[i][j] <<' ';
    		}
    		cout << '\n';
    	}
    
    }
    
    void L(){
    	queue<int> q;
    	for(int i = 1; i <= 8; i++){
    		for(int j = 1; j <= 8; j++){
    			if(board[i][j] == 0) continue;
    			q.push(board[i][j]);
    			board[i][j] = 0;
    		}
    		if(q.empty()) continue;
    		int j = 1;
    		int pre = q.front(); q.pop();
    		board[i][j] = pre;
    		j++;
    		while(!q.empty()){
    			int nxt = q.front(); q.pop();
    			
    			if(pre == nxt){
    				board[i][j-1] = pre * 2L;
    				pre = 0;
    			}
    			else{
    				board[i][j] = nxt;
    				pre = nxt;
    				j++;
    			}
    			
    		}
    	}
    	
    	for(int i = 1; i <=8; i++){
    		for(int j = 1; j <=8; j++){
    			cout << board[i][j] <<' ';
    		}
    		cout << '\n';
    	}
    }
    
    void R(){
    	queue<int> q;
    	for(int i = 1; i <= 8; i++){
    		for(int j = 8; j >= 1; j--){
    			if(board[i][j] == 0) continue;
    			q.push(board[i][j]);
    			board[i][j] = 0;
    		}
    		if(q.empty()) continue;
    		int j = 8;
    		int pre = q.front(); q.pop();
    		board[i][j] = pre;
    		j--;
    		while(!q.empty()){
    			int nxt = q.front(); q.pop();
    			
    			if(pre == nxt){
    				board[i][j+1] = pre * 2L;
    				pre = 0;
    			}
    			else{
    				board[i][j] = nxt;
    				pre = nxt;
    				j--;
    			}
    			
    		}
    	}
    	
    	for(int i = 1; i <=8; i++){
    		for(int j = 1; j <=8; j++){
    			cout << board[i][j] <<' ';
    		}
    		cout << '\n';
    	}
    }
    int main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	for(int i = 1; i <=8; i++){
    		for(int j = 1; j <=8; j++){
    			cin>> board[i][j];
    		}
    	}
    
    	char key;
    	cin >> key;
    	if(key =='U') U();
    	else if(key =='D') D();
    	else if(key =='L') L();
    	else if(key =='R') R();
    	return 0;
    }

    '알고리즘' 카테고리의 다른 글

    BOJ 17220 :마약수사대  (0) 2023.07.31
    BOJ 22352: 항체 인식  (0) 2023.07.31
    BOJ 25711 : 인경산  (0) 2023.07.31
    BOJ 17360 : 팰린드롬과 관련된 수열의 개수  (0) 2023.07.30
    프로그래머스 요격시스템  (0) 2023.07.30
Designed by Tistory.