본문 바로가기
코드업(codeup)/C

[코드업(codeup)/C]코드업(codeup) 2049 : 2048게임 2 C언어

by starfish22 2022. 1. 15.
728x90

▶문제 : 2048게임 2 (codeup.kr)

 

2048게임 2

4*4의 판이 입력된다. (게임 방법은 앞의 문제를 참고 바람)

codeup.kr

 

▶코드 작성

#include <stdio.h>

int main()
{
    int arr[4][4];
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            scanf("%d", &arr[i][j]);
        }
    }

    int n;
    for (int i = 0; i < 4; i++)//세로로 한줄씩 살펴보기
    {
        //합치는 부분
        for (int j = 0; j < 3; j++)
        {
            if (arr[j][i] > 0)//0이 아닌 값들 골라내기
            {
                for (int l = j + 1; l < 4; l++)
                {
                    if (arr[l][i] > 0)//0이 아닌 값들 골라내기
                    {
                        if (arr[j][i] == arr[l][i])
                        {//0이 아닌 값들 중 처음으로 찾은 값이 같다면
                            arr[j][i] *= 2;
                            arr[l][i] = 0;//합쳤으므로 0
                        }
                        break;//가까운 값들끼리 비교가 가능하므로 찾자마자 종료
                    }
                }
            }
        }

        //0값은 뒤로 미는 부분
        n = 0;
        for (int j = 0; j < 4; j++)
        {
            if (arr[j][i] > 0)//0이 아닌 값들은 앞에서부터 차곡차곡 대입한다
            {
                arr[n++][i] = arr[j][i];
            }
        }
        for (int j = n; j < 4; j++)
        {//대입하고 남은 공간은 0으로 채워준다
            arr[j][i] = 0;
        }
    }

    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

 

▶해석

세로로 첫 째줄부터 차근차근 반복하였다. 먼저 합치는 부분으로 0이 아닌 값을 배열의 위에서부터 찾고, 그 값과 가장 근접한 값이 합치기가 가능하므로 근접한 값 중 0이 아닌 값을 찾았다. 찾은 값이 전에 찾은 값과 같다면 합치기를 해주었고 합쳐진 후의 배열 빈 공간은 0을 대입하였다. 그리고 합치든 말든 0이 아닌 값을 찾으면 뒤에 남은 값들은 볼 이유가 없으므로 반복문을 종료해준다.

합치는 부분이 끝나면 0값을 뒤로 밀어줘야 하므로 변수 n을 이용하여 0이 아닌 값들은 앞에서부터 채워주고 남은 자리는 0으로 채워줬다. 이렇게 한 줄씩 반복해주면 값이 나온다.

처음에는 한 번에 계산이 가능할 줄 알고 몇 번 시도 끝에 포기하고 확실하게 가는 방향으로 코드를 작성하였다. 생각보다 시간이 오래 걸려서 , 코드가 더러워서 아쉽다.

728x90

댓글