๐Ÿ™‡โ€โ™€๏ธ[Gold II] 2048 (Easy) - 12100

๋ฌธ์ œ ๋งํฌ

์„ฑ๋Šฅ ์š”์•ฝ

๋ฉ”๋ชจ๋ฆฌ: 2028 KB, ์‹œ๊ฐ„: 20 ms

๋ถ„๋ฅ˜

๋ฐฑํŠธ๋ž˜ํ‚น, ๋ธŒ๋ฃจํŠธํฌ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜, ๊ตฌํ˜„, ์‹œ๋ฎฌ๋ ˆ์ด์…˜

์ œ์ถœ ์ผ์ž

2024๋…„ 2์›” 7์ผ 19:03:16

๋ฌธ์ œ ์„ค๋ช…

2048 ๊ฒŒ์ž„์€ 4ร—4 ํฌ๊ธฐ์˜ ๋ณด๋“œ์—์„œ ํ˜ผ์ž ์ฆ๊ธฐ๋Š” ์žฌ๋ฏธ์žˆ๋Š” ๊ฒŒ์ž„์ด๋‹ค. ์ด ๋งํฌ๋ฅผ ๋ˆ„๋ฅด๋ฉด ๊ฒŒ์ž„์„ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด ๊ฒŒ์ž„์—์„œ ํ•œ ๋ฒˆ์˜ ์ด๋™์€ ๋ณด๋“œ ์œ„์— ์žˆ๋Š” ์ „์ฒด ๋ธ”๋ก์„ ์ƒํ•˜์ขŒ์šฐ ๋„ค ๋ฐฉํ–ฅ ์ค‘ ํ•˜๋‚˜๋กœ ์ด๋™์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋•Œ, ๊ฐ™์€ ๊ฐ’์„ ๊ฐ–๋Š” ๋‘ ๋ธ”๋ก์ด ์ถฉ๋Œํ•˜๋ฉด ๋‘ ๋ธ”๋ก์€ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง€๊ฒŒ ๋œ๋‹ค. ํ•œ ๋ฒˆ์˜ ์ด๋™์—์„œ ์ด๋ฏธ ํ•ฉ์ณ์ง„ ๋ธ”๋ก์€ ๋˜ ๋‹ค๋ฅธ ๋ธ”๋ก๊ณผ ๋‹ค์‹œ ํ•ฉ์ณ์งˆ ์ˆ˜ ์—†๋‹ค. (์‹ค์ œ ๊ฒŒ์ž„์—์„œ๋Š” ์ด๋™์„ ํ•œ ๋ฒˆ ํ•  ๋•Œ๋งˆ๋‹ค ๋ธ”๋ก์ด ์ถ”๊ฐ€๋˜์ง€๋งŒ, ์ด ๋ฌธ์ œ์—์„œ ๋ธ”๋ก์ด ์ถ”๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค)

<๊ทธ๋ฆผ 1> <๊ทธ๋ฆผ 2> <๊ทธ๋ฆผ 3>

<๊ทธ๋ฆผ 1>์˜ ๊ฒฝ์šฐ์—์„œ ์œ„๋กœ ๋ธ”๋ก์„ ์ด๋™์‹œํ‚ค๋ฉด <๊ทธ๋ฆผ 2>์˜ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ, ์™ผ์ชฝ์œผ๋กœ ๋ธ”๋ก์„ ์ด๋™์‹œํ‚ค๋ฉด <๊ทธ๋ฆผ 3>์˜ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

<๊ทธ๋ฆผ 4> <๊ทธ๋ฆผ 5> <๊ทธ๋ฆผ 6> <๊ทธ๋ฆผ 7>

<๊ทธ๋ฆผ 4>์˜ ์ƒํƒœ์—์„œ ๋ธ”๋ก์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚ค๋ฉด <๊ทธ๋ฆผ 5>๊ฐ€ ๋˜๊ณ , ์—ฌ๊ธฐ์„œ ๋‹ค์‹œ ์œ„๋กœ ๋ธ”๋ก์„ ์ด๋™์‹œํ‚ค๋ฉด <๊ทธ๋ฆผ 6>์ด ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ธ”๋ก์„ ์ด๋™์‹œ์ผœ <๊ทธ๋ฆผ 7>์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

<๊ทธ๋ฆผ 8> <๊ทธ๋ฆผ 9>

<๊ทธ๋ฆผ 8>์˜ ์ƒํƒœ์—์„œ ์™ผ์ชฝ์œผ๋กœ ๋ธ”๋ก์„ ์˜ฎ๊ธฐ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? 2๊ฐ€ ์ถฉ๋Œํ•˜๊ธฐ ๋•Œ๋ฌธ์—, 4๋กœ ํ•ฉ์ณ์ง€๊ฒŒ ๋˜๊ณ  <๊ทธ๋ฆผ 9>์˜ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

<๊ทธ๋ฆผ 10> <๊ทธ๋ฆผ 11> <๊ทธ๋ฆผ 12> <๊ทธ๋ฆผ 13>

<๊ทธ๋ฆผ 10>์—์„œ ์œ„๋กœ ๋ธ”๋ก์„ ์ด๋™์‹œํ‚ค๋ฉด <๊ทธ๋ฆผ 11>์˜ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

<๊ทธ๋ฆผ 12>์˜ ๊ฒฝ์šฐ์— ์œ„๋กœ ๋ธ”๋ก์„ ์ด๋™์‹œํ‚ค๋ฉด <๊ทธ๋ฆผ 13>์˜ ์ƒํƒœ๊ฐ€ ๋˜๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” ํ•œ ๋ฒˆ์˜ ์ด๋™์—์„œ ์ด๋ฏธ ํ•ฉ์ณ์ง„ ๋ธ”๋ก์€ ๋˜ ํ•ฉ์ณ์งˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

<๊ทธ๋ฆผ 14> <๊ทธ๋ฆผ 15>

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋˜‘๊ฐ™์€ ์ˆ˜๊ฐ€ ์„ธ ๊ฐœ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ชฝ์˜ ์นธ์ด ๋จผ์ € ํ•ฉ์ณ์ง„๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„๋กœ ์ด๋™์‹œํ‚ค๋Š” ๊ฒฝ์šฐ์—๋Š” ์œ„์ชฝ์— ์žˆ๋Š” ๋ธ”๋ก์ด ๋จผ์ € ํ•ฉ์ณ์ง€๊ฒŒ ๋œ๋‹ค. <๊ทธ๋ฆผ 14>์˜ ๊ฒฝ์šฐ์— ์œ„๋กœ ์ด๋™ํ•˜๋ฉด <๊ทธ๋ฆผ 15>๋ฅผ ๋งŒ๋“ ๋‹ค.

์ด ๋ฌธ์ œ์—์„œ ๋‹ค๋ฃจ๋Š” 2048 ๊ฒŒ์ž„์€ ๋ณด๋“œ์˜ ํฌ๊ธฐ๊ฐ€ Nร—N ์ด๋‹ค. ๋ณด๋“œ์˜ ํฌ๊ธฐ์™€ ๋ณด๋“œํŒ์˜ ๋ธ”๋ก ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ตœ๋Œ€ 5๋ฒˆ ์ด๋™ํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ๋ธ”๋ก์˜ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋ณด๋“œ์˜ ํฌ๊ธฐ N (1 โ‰ค N โ‰ค 20)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฒŒ์ž„ํŒ์˜ ์ดˆ๊ธฐ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ ์นธ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ด์™ธ์˜ ๊ฐ’์€ ๋ชจ๋‘ ๋ธ”๋ก์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋ธ”๋ก์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๋Š” 2๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 1024๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ 2์˜ ์ œ๊ณฑ๊ผด์ด๋‹ค. ๋ธ”๋ก์€ ์ ์–ด๋„ ํ•˜๋‚˜ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ตœ๋Œ€ 5๋ฒˆ ์ด๋™์‹œ์ผœ์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ๋ธ”๋ก์„ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿš€ํ’€์ด

3์‹œ๊ฐ„๋งŒ์— ํ’€์—ˆ๋‹คโ€ฆ.

๋ฌธ์ œ ํ’€์ด์˜ ๋กœ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

DFS๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋Š”๋ฐ, ๋‚˜๋Š” ์™ผ์ชฝ์œผ๋กœ ์ด๋™, ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™, ์•„๋ž˜๋กœ ์ด๋™ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๋งŒ๋“ค์ง€ ์•Š์•˜๋‹ค.

๊ทธ ๋Œ€์‹  ์œ„๋กœ ์›€์ง์ด๋Š” ํ•จ์ˆ˜๋งŒ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์€ ๋ณด๋“œ๋ฅผ ํšŒ์ „ํ•ด์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค.

void rotation(int cnt)
{
	// ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ 90๋„ ์”ฉ cnt๋ฒˆ ํšŒ์ „

	vector<vector<int>> temp(n, vector<int>(n));
	vector<vector<int>> temp2(n, vector<int>(n));

	for (int k = 0; k < cnt; ++k)
	{
		// ํšŒ์ „ํ•˜๋Š” ๋กœ์ง
		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				temp[i][j] = board[n - j - 1][i];
				temp2[i][j] = visited[n - j - 1][i];
			}
		}

		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				board[i][j] = temp[i][j];
				visited[i][j] = temp2[i][j];
			}
		}
	}
}

์ „์—ญ ๋ณ€์ˆ˜๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

int n;
vector<vector<int>> board;
int visited[20][20];

int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };

๋ฐฉ๋ฌธ์„ ์™œ ๋งŒ๋“ค์—ˆ๋ƒ๋ฉด ํ•œ๋ฒˆ ์ด๋™์— ํ•œ๋ฒˆ์— ํ•ฉ์ณ์ง€๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด๋‹ค.

๊ทธ๊ฑด moveํ•จ์ˆ˜์—์„œ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
moveํ•จ์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void move(int y, int x, int dir)
{
	// ์ด๋™ํ•˜๋Š” ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์งˆ๊ฑฐ๊ฐ™๋‹ค
	// ์ด๋™ํ•˜๋Š” ๋ฐฉํ–ฅ์ด ์œ„๋ผ๋ฉด...
	// ๋งจ ์œ— ์ค„๋ถ€ํ„ฐ ๊ณ„์‚ฐ ์‹œ์ž‘?
	// ๋ณด๋“œ ๋งจ ์œ—์ค„๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ, ๋‚ด๋ž‘ ๊ฐ™์€ ์ˆซ์ž๋ฅผ ๋งŒ๋‚˜๋ฉด ํ•ฉ์ฒด
	// 0์ด๋ฉด ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€
	// ๋‹ค๋ฅธ ์ˆซ์ž๋ฉด ๋ฉˆ์ถ”๊ธฐ
	// ๋ฒฝ์•ž๊นŒ์ง€


	int cur = board[y][x];
	while (true)
	{
		if (cur == 0)
			break;

		if (y + dy[dir] == -1)
			break;

		if (board[y + dy[dir]][x + dx[dir]] == cur)
		{
            // ์—ฌ๊ธฐ์„œ ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฉด ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€๊ณ  while์„ ๋‚˜๊ฐ„๋‹ค.
			if (visited[y + dy[dir]][x + dx[dir]] == 1)
				break;

			board[y + dy[dir]][x + dx[dir]] = cur * 2;
			visited[y + dy[dir]][x + dx[dir]] = 1;
			board[y][x] = 0;
			break;
		}

		if (board[y + dy[dir]][x + dx[dir]] != cur && board[y + dy[dir]][x + dx[dir]] != 0)
			break;

		if (board[y + dy[dir]][x + dx[dir]] == 0)
		{
			board[y + dy[dir]][x + dx[dir]] = cur;
			board[y][x] = 0;

			y += dy[dir];
			x += dx[dir];
		}

	}
}

2048์˜ ๊ทœ์น™์— ๋งž๊ฒŒ ์ด๋™ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.
์ด๊ฑด ํ•˜๋‚˜์˜ ์ ๋งŒ ์ด๋™ํ•˜๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ ์ „์ฒด๋ฅผ ์ด๋™ํ•˜๋Š” ํ•จ์ˆ˜๋„ ๋งŒ๋“ค์–ด ์คฌ๋‹ค.

void moveAll()
{
	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			move(i, j, 0);
		}
	}
}

move๋ฅผ ์ „์ฒด์ ์œผ๋กœ ์›€์ง์—ฌ์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

์œ„์˜ ํ•จ์ˆ˜๋“ค์„ ์ด์šฉํ•ด์„œ DFS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

int res = -1;
void DFS(int L)
{
    // ์ด ๋ถ€๋ถ„์€ ์•„๋งˆ ํ•„์š”์—†์„ํ…๋ฐ ๊ทธ๋ƒฅ ๋„ฃ์–ด์คŒ.
	if (L > 5)
		return;

    // 5๋ฒˆ ์›€์ง์˜€์„ ๋•Œ ๊ฒฐ๊ณผ
	if (L == 5)
	{
        // ๋ณด๋“œ์—์„œ ์ตœ๋Œ“๊ฐ’์ฐพ์•„์ฃผ๊ธฐ.
		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				res = max(res, board[i][j]);
			}
		}

		return;
	}


	// ์ด์ „๊ฐ’์„ ๊ธฐ์–ตํ•ด์ค˜์„œ ๋‚˜์ค‘์— ๋ณต์› ์‹œ์ผœ์ค˜์•ผํ•œ๋‹ค.
	int tempBoard[20][20];
	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			tempBoard[i][j] = board[i][j];
		}
	}


	for (int i = 0; i < 4; ++i)
	{
        // i * 90๋„ ๋งŒํผ ํšŒ์ „
		rotation(i);
        // ์œ„๋กœ ์˜ฌ๋ ค์ฃผ๊ธฐ
		moveAll();
		// ๋ฐฉ๋ฌธ ์ดˆ๊ธฐํ™”
		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				visited[i][j] = 0;
			}
		}
        // (4 - i) * 90๋„ ๋งŒํผ ํšŒ์ „ํ•ด์„œ ์ฒ˜์Œ ๋ณด๋“œ ํšŒ์ „๊ฐ’์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ.
		rotation(4 - i);

		DFS(L + 1);

        // DFS๋ฅผ ๋น ์ ธ๋‚˜์™”์œผ๋‹ˆ ๋ณด๋“œ ์›๋ณต.
		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				board[i][j] = tempBoard[i][j];
			}
		}
	}

}

solveํ•จ์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void solve()
{
    // ๋ฌธ์ œ์˜ ์ž…๋ ฅ๊ฐ’ ๋ฐ›๊ธฐ.
	cin >> n;
	board = vector<vector<int>>(n, vector<int>(n));

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

	// ๋กœ์ง
	// ์ตœ๋Œ€ 5ํšŒ์˜ ๊ฒฝ์šฐ ์ตœ๋Œ€ ๊ฒฐ๊ณผ ๊ฐ’์„ ์ถœ๋ ฅ
	// ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ํ•ด๋ณธ๋‹ค.
	// ๋ธŒ๋ฃจํŠธํฌ์Šค ๋ฐฉ๋ฒ•
	// ๋ฌด์‹ํ•˜๊ฒŒ ํ’€๊ธฐ.

	// ๊ทธ๋Ÿผ ํ•œ ๋ฒˆ ์ด๋™ํ•  ๋•Œ ๋ณ€ํ•˜๋Š” ๋กœ์ง์„ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.
	// ์ด๋™์€ move?
	// ๋ฐฉํ–ฅ ๊ฐ’์„ ๋ฐ›์•„์•ผํ•œ๋‹ค.
	// dir ํ•„์š”

    // DFS๋Œ๋ฆฌ๊ธฐ
	DFS(0);

    // ๊ฒฐ๊ณผ ์ถœ๋ ฅ.
	cout << res;
}

๊ธธ๊ณ ๋„ ๊ธธ์—ˆ๋˜ 3์‹œ๊ฐ„์งœ๋ฆฌ ๋ฌธ์ œ์˜€๋‹ค.
๋กœ์ง์€ ์•„๋ฆ„๋‹ต๊ฒŒ ์ƒ๊ฐ์ด ๋‚ฌ๋Š”๋ฐ ๊ณ„์† ํ‹€๋ ค์„œ ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค.

ํŠนํžˆ DFS์—์„œ ์›๋ณตํ•ด์•ผํ•˜๋Š”๊ฒŒ ์ž˜ ์•ˆ๋˜์–ด์„œ ๋” ๊ฑธ๋ ธ๋‹ค.

๊ทธ๋ž˜๋„ ๋ฌธ์ œ๋Š” ํ’€์—ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ!

๐Ÿš€์ „์ฒด ์ฝ”๋“œ

์ค‘๊ฐ„ ์ค‘๊ฐ„ ์ฒดํฌํ•˜๋Š” ํ•จ์ˆ˜๋“ค์ด ์žˆ๋Š”๋ฐ ์ง€์šฐ๊ธฐ ๊ท€์ฐฎ์•„์„œ ๊ทธ๋ƒฅ ๋‹ค ๋„ฃ์—ˆ๋‹ค.

์ฃผ์„๋„ ์ง€์šฐ๊ธฐ ๊ท€์ฐฎ์•„..

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>

using namespace std;

int n;
vector<vector<int>> board;
int visited[20][20];

int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };

// ๋ฏธ์ณ๋ฒ„๋ฆฐ ์ƒ๊ฐ
// ๋ณด๋“œ๋ฅผ ํšŒ์ „์‹œ์ผœ์„œ ๋ฐ˜๋ณต๋ฌธ์„ ์ผ์ •ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ!!
// rotation ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.

void rotation(int cnt)
{
	// ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ 90๋„ ์”ฉ cnt๋ฒˆ ํšŒ์ „

	vector<vector<int>> temp(n, vector<int>(n));
	vector<vector<int>> temp2(n, vector<int>(n));

	for (int k = 0; k < cnt; ++k)
	{
		// ํšŒ์ „ํ•˜๋Š” ๋กœ์ง
		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				temp[i][j] = board[n - j - 1][i];
				temp2[i][j] = visited[n - j - 1][i];
			}
		}

		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				board[i][j] = temp[i][j];
				visited[i][j] = temp2[i][j];
			}
		}
	}
}

void move(int y, int x, int dir)
{
	// ์ด๋™ํ•˜๋Š” ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์งˆ๊ฑฐ๊ฐ™๋‹ค
	// ์ด๋™ํ•˜๋Š” ๋ฐฉํ–ฅ์ด ์œ„๋ผ๋ฉด...
	// ๋งจ ์œ— ์ค„๋ถ€ํ„ฐ ๊ณ„์‚ฐ ์‹œ์ž‘?
	// ๋ณด๋“œ ๋งจ ์œ—์ค„๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ, ๋‚ด๋ž‘ ๊ฐ™์€ ์ˆซ์ž๋ฅผ ๋งŒ๋‚˜๋ฉด ํ•ฉ์ฒด
	// 0์ด๋ฉด ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€
	// ๋‹ค๋ฅธ ์ˆซ์ž๋ฉด ๋ฉˆ์ถ”๊ธฐ
	// ๋ฒฝ์•ž๊นŒ์ง€


	int cur = board[y][x];
	while (true)
	{
		if (cur == 0)
			break;

		if (y + dy[dir] == -1)
			break;

		if (board[y + dy[dir]][x + dx[dir]] == cur)
		{
			if (visited[y + dy[dir]][x + dx[dir]] == 1)
				break;

			board[y + dy[dir]][x + dx[dir]] = cur * 2;
			visited[y + dy[dir]][x + dx[dir]] = 1;
			board[y][x] = 0;
			break;
		}

		if (board[y + dy[dir]][x + dx[dir]] != cur && board[y + dy[dir]][x + dx[dir]] != 0)
			break;

		if (board[y + dy[dir]][x + dx[dir]] == 0)
		{
			board[y + dy[dir]][x + dx[dir]] = cur;
			board[y][x] = 0;

			y += dy[dir];
			x += dx[dir];
		}

	}
}

void moveAll()
{
	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			move(i, j, 0);
		}
	}
}

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

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


int res = -1;
void DFS(int L)
{
	if (L > 5)
		return;

	if (L == 5)
	{
		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				res = max(res, board[i][j]);
			}
		}

		return;
	}


	// ๋ณด๋“œ ์›์ƒ ๋ณต๊ท€?
	int tempBoard[20][20];
	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			tempBoard[i][j] = board[i][j];
		}
	}


	for (int i = 0; i < 4; ++i)
	{
		rotation(i);
		moveAll();
		// ๋ฐฉ๋ฌธ ์ดˆ๊ธฐํ™”
		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				visited[i][j] = 0;
			}
		}
		rotation(4 - i);

		//if (i == 0)
		//	cout << "UP" << endl;
		//else if (i == 1)
		//	cout << "LEFT" << endl;
		//else if (i == 2)
		//	cout << "DOWN" << endl;
		//else if (i == 3)
		//	cout << "RIGHT" << endl;

		//printBoard();
		//cout << "printVisited" << endl;
		//printVisited();
		//cout << endl;

		DFS(L + 1);

		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				board[i][j] = tempBoard[i][j];
			}
		}
	}

}

void solve()
{
	cin >> n;
	board = vector<vector<int>>(n, vector<int>(n));

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

	// ๋กœ์ง
	// ์ตœ๋Œ€ 5ํšŒ์˜ ๊ฒฝ์šฐ ์ตœ๋Œ€ ๊ฒฐ๊ณผ ๊ฐ’์„ ์ถœ๋ ฅ
	// ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ํ•ด๋ณธ๋‹ค.
	// ๋ธŒ๋ฃจํŠธํฌ์Šค ๋ฐฉ๋ฒ•
	// ๋ฌด์‹ํ•˜๊ฒŒ ํ’€๊ธฐ.

	// ๊ทธ๋Ÿผ ํ•œ ๋ฒˆ ์ด๋™ํ•  ๋•Œ ๋ณ€ํ•˜๋Š” ๋กœ์ง์„ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.
	// ์ด๋™์€ move?
	// ๋ฐฉํ–ฅ ๊ฐ’์„ ๋ฐ›์•„์•ผํ•œ๋‹ค.
	// dir ํ•„์š”

	DFS(0);

	cout << res;
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	//freopen("input.txt", "rt", stdin);

	solve();

	return 0;
}

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: