[코드트리] 2048 게임

rhkr9080·2023년 7월 13일
0

코드트리

목록 보기
2/29

문제링크 : https://www.codetree.ai/training-field/frequent-problems/problems/2048-game/description?page=1&pageSize=20

💻 문제 풀이 : C++

// 요구사항
// 1. 4방향 중력
//    => temp_map 만들어야 하나?
// 2. 최대값 찾기
// 3. 5번 움직일 동안 방향 선택하기
//    => 
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>

#define MAP_SIZE 25

using namespace std;

int n, answer;
int MAP[MAP_SIZE][MAP_SIZE];
int ORIG_MAP[MAP_SIZE][MAP_SIZE];
vector<int> picked;

void CLEAR()
{
	n = 0;
	answer = 0;
	memset(MAP, 0, sizeof(MAP));
	memset(ORIG_MAP, 0, sizeof(ORIG_MAP));
	picked.clear();
}

// 상, 하, 좌, 우
int dr[] = {-1, 1,0 ,0};
int dc[] = {0, 0,-1, 1};

void INIT()
{
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cin >> ORIG_MAP[i][j];
		}
	}
}

int getMax()
{
	int maxAns = 0;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			if (maxAns < MAP[i][j])
				maxAns = MAP[i][j];
	return maxAns;
}

void mix(int dir)
{
	// 1. 같은 숫자 확인
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n-1; j++)
		{
			// 상
			if (dir == 0)
			{
				if (MAP[j][i] == MAP[j + 1][i])
				{
					MAP[j][i] *= 2;
					MAP[j + 1][i] = 0;
				}
			}
			// 하
			else if (dir == 1)
			{
				if (MAP[n - j - 1][i] == MAP[n - j - 2][i])
				{
					MAP[n - j - 1][i] *= 2;
					MAP[n - j - 2][i] = 0;
				}
			}
			// 좌
			else if (dir == 2)
			{
				if (MAP[i][j] == MAP[i][j+1])
				{
					MAP[i][j] *= 2;
					MAP[i][j+1] = 0;
				}
			}
			// 우
			else if (dir == 3)
			{
				if (MAP[i][n - j - 1] == MAP[i][n - j - 2])
				{
					MAP[i][n - j - 1] *= 2;
					MAP[i][n - j - 2] = 0;
				}
			}
		}
	}
}

// 이동
void move(int dir)
{
	for (int i = 0; i < n; i++)
	{
		int tmp[MAP_SIZE] = { 0 };
		int idx = 0;
		for (int j = 0; j < n; j++)
		{
			if (dir == 0)
			{
				if (MAP[j][i])
					tmp[idx++] = MAP[j][i];
			}
			else if (dir == 1)
			{
				if (MAP[n - j - 1][i])
					tmp[idx++] = MAP[n - j - 1][i];
			}
			else if (dir == 2)
			{
				if (MAP[i][j])
					tmp[idx++] = MAP[i][j];
			}
			else if (dir == 3)
			{
				if (MAP[i][n - j - 1])
					tmp[idx++] = MAP[i][n - j - 1];
			}
		}
		for (int j = 0; j < n; j++)
		{
			if (dir == 0)
				MAP[j][i] = tmp[j];
			else if (dir == 1)
				MAP[n - j - 1][i] = tmp[j];
			else if (dir == 2)
				MAP[i][j] = tmp[j];
			else if (dir == 3)
				MAP[i][n - j - 1] = tmp[j];
		}
	}
}

void printMap()
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cout << MAP[i][j] << " ";
		}
		cout << endl;
	}
}

void copyOrigin()
{
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			MAP[i][j] = ORIG_MAP[i][j];
}

void dfs(int count)
{
	if (count >= 5) {
		copyOrigin();
		for (int i = 0; i < picked.size(); i++)
		{
			mix(picked[i]);
			move(picked[i]);
		}
		answer = max(answer, getMax());
		return;
	}

	for (int i = 0; i < 4; i++)
	{
		picked.push_back(i);
		dfs(count + 1);
		picked.pop_back();
	}
}

void SOLVE()
{
	dfs(0);
	cout << answer << "\n";
}

int main()
{
	CLEAR();
	INIT();
	SOLVE();

	return 0;
}

📌 memo 😊

구현 문제 전략 세우기

  1. 코드 간결 vs 논리 간결
    => 논리가 간결해야 시간을 단축함
    => 코드의 효율성은 나중에 생각하자!!!

  2. 변수 이름 만들기 힘들어...
    => 무조건 Camel Style로 하자!!

profile
공부방

0개의 댓글