BOJ 12100. 2048 (Easy)
๐โโ๏ธ[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;
}