[백준] 12100번*

Jeanine·2022년 4월 6일
0

baekjoon

목록 보기
63/120
post-thumbnail

💻 C++ 기반

2048 (Easy)
https://www.acmicpc.net/problem/12100

✔️ 상하좌우를 5번 다 반복한다고 생각하지 말고, 5번의 방향으로 나올 수 있는 조합을 먼저 구하기
(15683번 아이디어 참고)
✔️ 블록 옮기는 아이디어는 O(N)으로도 해결할 수 있음 -> 인덱스를 잘 활용해보자
✔️ 정 모르겠으면 유투브 강의 참고

#include <cstdio>
#include <algorithm>

#define MAX 21

using namespace std;

int N;
int board[MAX][MAX];
int board_copy[MAX][MAX];

void rotateBoard()
{
    int temp[MAX][MAX];
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            temp[i][j] = board_copy[i][j];
        }
    }
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            board_copy[i][j] = temp[N - 1 - j][i];
        }
    }
}

void func(int dir)
{
    while(dir--)
    {
        rotateBoard();
    }
 
    for (int i = 0; i < N; i++)
    {
        int temp[MAX] = {}; // 전역변수 배열이 아니므로 초기화 필수
        int idx = 0;
        for (int j = 0; j < N; j++)
        {
            if (board_copy[i][j] != 0)
            {
                if (temp[idx] == 0)
                {
                    temp[idx] = board_copy[i][j];
                }
                else if (temp[idx] == board_copy[i][j])
                {
                    temp[idx] += board_copy[i][j];
                    idx++; // 이렇게 인덱스를 증가시키므로 해당 블록이 중복으로 충돌될 가능성 배제
                }
                else
                {
                    idx++;
                    temp[idx] = board_copy[i][j];
                }
            }
        }
        for (int j = 0; j < N; j++)
        {
            board_copy[i][j] = temp[j];
        }
    }
}

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

    int ans = 0;
    for (int temp = 0; temp < (1<<(2*5)); temp++) // 1<<(2*5)는 4의 5승
    {
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                board_copy[i][j] = board[i][j];
            }
        }
        int num = temp;
        for (int i = 0; i < 5; i++)
        {
            int dir = num % 4;
            num /= 4;
            func(dir);
        }

        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                ans = max(ans, board_copy[i][j]);
            }
        }
    }

    printf("%d", ans);
    return 0;
}
profile
Grow up everyday

0개의 댓글