지우너
[코드트리] 단 한 번의 2048 시도 C++ 본문
문제
계획세우기
문제에서 주어진 대로 shift와 combine을 주어진 방향대로 하면 될 것 같았다.
비슷한 구조의 반복문을 여러 개 쓰는 게 조금 더러워 보였는데, 조건에 따라 합치는 방향이 달라져야 해서 어쩔 수 없었다...
(다 푼 뒤 해설을 보니 배열을 회전 시킨 후 아래 방향 shift+combine을 해주고 다시 회전 시켜주는 방식으로 구현해서 깔끔하다고 생각했다...)
풀이
#include <iostream>
using namespace std;
int arr[4][4];
char dir; // ‘L', ‘R’, ‘U’, 'D’
// Shift Func
void LeftShift(){
for(int row=0; row<4; row++){
int endOfIdx=-1;
// 0찾기
for(int col=0; col<4; col++){
if(arr[row][col]==0){
endOfIdx=col;
break;
}
}
if(endOfIdx==-1) continue; // 0이 없으면 shift x
// shift
for(int col=endOfIdx+1; col<4; col++){
if(arr[row][col]!=0){
arr[row][endOfIdx]=arr[row][col];
arr[row][col]=0;
endOfIdx++;
}
}
}
}
void RightShift(){
for(int row=0; row<4; row++){
int endOfIdx=-1;
// 0찾기
for(int col=3; col>=0; col--){
if(arr[row][col]==0){
endOfIdx=col;
break;
}
}
if(endOfIdx==-1) continue; // 0이 없으면 shift x
// shift
for(int col=endOfIdx-1; col>=0; col--){
if(arr[row][col]!=0){
arr[row][endOfIdx]=arr[row][col];
arr[row][col]=0;
endOfIdx--;
}
}
}
}
void UpShift(){
for(int col=0; col<4; col++){
int endOfIdx=-1;
// 0찾기
for(int row=0; row<4; row++){
if(arr[row][col]==0){
endOfIdx=row;
break;
}
}
if(endOfIdx==-1) continue; // 0이 없으면 shift x
// shift
for(int row=endOfIdx+1; row<4; row++){
if(arr[row][col]!=0){
arr[endOfIdx][col]=arr[row][col];
arr[row][col]=0;
endOfIdx++;
}
}
}
}
void DownShift(){
for(int col=0; col<4; col++){
int endOfIdx=-1;
// 0찾기
for(int row=3; row>=0; row--){
if(arr[row][col]==0){
endOfIdx=row;
break;
}
}
if(endOfIdx==-1) continue; // 0이 없으면 shift x
// shift
for(int row=endOfIdx-1; row>=0; row--){
if(arr[row][col]!=0){
arr[endOfIdx][col]=arr[row][col];
arr[row][col]=0;
endOfIdx--;
}
}
}
}
void Shift(){
if(dir=='L') LeftShift();
else if(dir=='R') RightShift();
else if(dir=='U') UpShift();
else DownShift();
}
//Combine Func
void LeftCombine(){
for(int row=0; row<4; row++){
for(int col=0; col<3; col++){
if(arr[row][col]==arr[row][col+1]){
arr[row][col]*=2;
arr[row][col+1]=0;
}
}
}
}
void RightCombine(){
for(int row=0; row<4; row++){
for(int col=3; col>0; col--){
if(arr[row][col]==arr[row][col-1]){
arr[row][col]*=2;
arr[row][col-1]=0;
}
}
}
}
void UpCombine(){
for(int col=0; col<4; col++){
for(int row=0; row<3; row++){
if(arr[row][col]==arr[row+1][col]){
arr[row][col]*=2;
arr[row+1][col]=0;
}
}
}
}
void DownCombine(){
for(int col=0; col<4; col++){
for(int row=3; row>0; row--){
if(arr[row][col]==arr[row-1][col]){
arr[row][col]*=2;
arr[row-1][col]=0;
}
}
}
}
void Combine(){
if(dir=='L') LeftCombine();
else if(dir=='R') RightCombine();
else if(dir=='U') UpCombine();
else DownCombine();
}
int main() {
//input
for(int i=0; i<4; i++){
for(int j=0; j<4; j++){
cin >> arr[i][j];
}
}
cin >> dir;
//solution
Shift();
Combine();
Shift();
//output
for(int i=0; i<4; i++){
for(int j=0; j<4; j++){
cout << arr[i][j] << " ";
}
cout <<'\n';
}
return 0;
}
'Problem Solving' 카테고리의 다른 글
[코드트리] 2차원 폭발 게임 C++ (0) | 2024.06.12 |
---|---|
[코드트리] 십자 모양의 지속적 폭발 C++ (0) | 2024.06.11 |
[코드트리] 벽 짚고 미로 탈출하기 C++ (0) | 2024.06.09 |
[코드트리] 1차원 폭발 게임 C++ (0) | 2024.06.08 |
[코드트리] 숫자가 더 큰 인접한 곳으로 이동 C++ (0) | 2024.06.07 |