-
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