지우너

[코드트리] 단 한 번의 2048 시도 C++ 본문

Problem Solving

[코드트리] 단 한 번의 2048 시도 C++

지옹 2024. 6. 10. 10:09

문제

https://www.codetree.ai/missions/2/problems/one-trial-of-2048-game?&utm_source=clipboard&utm_medium=text

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

계획세우기

문제에서 주어진 대로 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;
}