๐ ๋ฌธ์
https://www.acmicpc.net/problem/12100
๋ฌธ์
2048 ๊ฒ์์ 4×4 ํฌ๊ธฐ์ ๋ณด๋์์ ํผ์ ์ฆ๊ธฐ๋ ์ฌ๋ฏธ์๋ ๊ฒ์์ด๋ค. ์ด ๋งํฌ๋ฅผ ๋๋ฅด๋ฉด ๊ฒ์์ ํด๋ณผ ์ ์๋ค.
์ด ๊ฒ์์์ ํ ๋ฒ์ ์ด๋์ ๋ณด๋ ์์ ์๋ ์ ์ฒด ๋ธ๋ก์ ์ํ์ข์ฐ ๋ค ๋ฐฉํฅ ์ค ํ๋๋ก ์ด๋์ํค๋ ๊ฒ์ด๋ค. ์ด๋, ๊ฐ์ ๊ฐ์ ๊ฐ๋ ๋ ๋ธ๋ก์ด ์ถฉ๋ํ๋ฉด ๋ ๋ธ๋ก์ ํ๋๋ก ํฉ์ณ์ง๊ฒ ๋๋ค. ํ ๋ฒ์ ์ด๋์์ ์ด๋ฏธ ํฉ์ณ์ง ๋ธ๋ก์ ๋ ๋ค๋ฅธ ๋ธ๋ก๊ณผ ๋ค์ ํฉ์ณ์ง ์ ์๋ค. (์ค์ ๊ฒ์์์๋ ์ด๋์ ํ ๋ฒ ํ ๋๋ง๋ค ๋ธ๋ก์ด ์ถ๊ฐ๋์ง๋ง, ์ด ๋ฌธ์ ์์ ๋ธ๋ก์ด ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ๋ ์๋ค)
<๊ทธ๋ฆผ 1>์ ๊ฒฝ์ฐ์์ ์๋ก ๋ธ๋ก์ ์ด๋์ํค๋ฉด <๊ทธ๋ฆผ 2>์ ์ํ๊ฐ ๋๋ค. ์ฌ๊ธฐ์, ์ผ์ชฝ์ผ๋ก ๋ธ๋ก์ ์ด๋์ํค๋ฉด <๊ทธ๋ฆผ 3>์ ์ํ๊ฐ ๋๋ค.
<๊ทธ๋ฆผ 4>์ ์ํ์์ ๋ธ๋ก์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋์ํค๋ฉด <๊ทธ๋ฆผ 5>๊ฐ ๋๊ณ , ์ฌ๊ธฐ์ ๋ค์ ์๋ก ๋ธ๋ก์ ์ด๋์ํค๋ฉด <๊ทธ๋ฆผ 6>์ด ๋๋ค. ์ฌ๊ธฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ธ๋ก์ ์ด๋์์ผ <๊ทธ๋ฆผ 7>์ ๋ง๋ค ์ ์๋ค.
<๊ทธ๋ฆผ 8>์ ์ํ์์ ์ผ์ชฝ์ผ๋ก ๋ธ๋ก์ ์ฎ๊ธฐ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? 2๊ฐ ์ถฉ๋ํ๊ธฐ ๋๋ฌธ์, 4๋ก ํฉ์ณ์ง๊ฒ ๋๊ณ <๊ทธ๋ฆผ 9>์ ์ํ๊ฐ ๋๋ค.
์ดํ์๋ต ...
์ด ๋ฌธ์ ์์ ๋ค๋ฃจ๋ 2048 ๊ฒ์์ ๋ณด๋์ ํฌ๊ธฐ๊ฐ N×N ์ด๋ค. ๋ณด๋์ ํฌ๊ธฐ์ ๋ณด๋ํ์ ๋ธ๋ก ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, ์ต๋ 5๋ฒ ์ด๋ํด์ ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ํฐ ๋ธ๋ก์ ๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ณด๋์ ํฌ๊ธฐ N (1 ≤ N ≤ 20)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๊ฒ์ํ์ ์ด๊ธฐ ์ํ๊ฐ ์ฃผ์ด์ง๋ค. 0์ ๋น ์นธ์ ๋ํ๋ด๋ฉฐ, ์ด์ธ์ ๊ฐ์ ๋ชจ๋ ๋ธ๋ก์ ๋ํ๋ธ๋ค. ๋ธ๋ก์ ์ฐ์ฌ ์๋ ์๋ 2๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 1024๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ 2์ ์ ๊ณฑ๊ผด์ด๋ค. ๋ธ๋ก์ ์ ์ด๋ ํ๋ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ต๋ 5๋ฒ ์ด๋์์ผ์ ์ป์ ์ ์๋ ๊ฐ์ฅ ํฐ ๋ธ๋ก์ ์ถ๋ ฅํ๋ค.
โ๏ธ ํ์ด
ํฐ ๊ทธ๋ฆผ์ ๊ทธ๋ ค๋ณด์๋ฉด ์๋์ ๊ฐ์ด ๋๋ ์ ์๋ค.
โป๏ธ ์ด๋ํ์๋ฅผ ๊น์ด๋ก ํ์ฌ, ๊ฐ ๋จ๊ณ๋ง๋ค (์/์๋/์ข/์ฐ)๋ฅผ ํํ๋ DFS ํ์์ ํ๋ค.
โป๏ธ ํํ ๋ฐฉํฅ๋๋ก ๋ธ๋ก๋ค์ ์ฎ๊ฒจ์ค ๋ค์, ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ๋ค.
โป๏ธ 5๋จ๊ณ๊น์ง ์์ผ๋ฉด, ๋ง๋ค์ด์ง 2048 ๋ธ๋ก ์ค ๊ฐ์ฅ ํฐ ์ซ์๋ฅผ ์ฐพ์ ๊ฒฐ๊ณผ๊ฐ์ ์ ๋ฐ์ดํธ ํด์ค๋ค.
โป๏ธ ๋ชจ๋ DFS ํ์์ด ๋๋๊ณ ๊ฒฐ๊ณผ๊ฐ์ ์ถ๋ ฅํ๋ค.
๐ก ์ด ์ฌ์ด์์ ์ค์ํ๊ฒ ์ฒดํฌํด์ผ ํ๋ ๋ถ๋ถ์ ์ด๋ ๋ค.
โ๏ธ DFS ํ์์ ๊น์ด K์์ ํน์ ๋ฐฉํฅ์ผ๋ก ๋ธ๋ก์ ์ด๋์ํจ ํ ๊น์ด K+1๋ก ๋์ด๊ฐ๋ค๋ฉด, ๋ค์ K๋จ๊ณ์์ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ์ด๋์ํฌ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํ์ฌ ๋ฐฐ์ด์ ์๋๋๋ก ๋๋ ค์ค์ผ ํ๋ค.
โ๏ธ ๋ธ๋ก์ ์ด๋์ํฌ ๋ ๋ฐ๊ฒฌํ ๋ธ๋ก์ ์ฎ๊ธธ ์์น(์ด์ ์นธ)์ ๋ฐ๋ผ ์ธ ๊ฐ์ง์ ์ผ์ด์ค๊ฐ ์กด์ฌํ๋ค.
โป๏ธ ์ด์ ์นธ์ด ๋น ๊ณณ์ด๋ฉด
๊ทธ ์์น๋ก ๋ธ๋ก์ ์ฎ๊ฒจ์ค๋ค. ๋จ, ๊ทธ ๋ค์ ๋ธ๋ก์ด ์ง๊ธ ๋ธ๋ก๊ณผ ๊ฐ์ ์ซ์์ผ ์๋ ์์ผ๋ ์ด์ ์นธ์ ์ธ๋ฑ์ค๋ ๊ทธ๋๋ก ๋๋ค. ์ฆ, ๋ค์ ๋ฃจํ์์ ์ด์ ์นธ์ด ๊ฐ๋ฅดํค๋ ๊ฒ์ ๋ฐฉ๊ธ ์ฎ๊ธด ๋ธ๋ก์ด ๋๋ค.
โป๏ธ ์ด์ ์นธ์ ์ง๊ธ ๋ธ๋ก๊ณผ ๊ฐ์ ๋ธ๋ก์ด ์์ผ๋ฉด
์ซ์๋ฅผ ํฉ์ณ์ผ ํ๋ ์ผ์ด์ค์ด๋ค. ๋ ๋ธ๋ก์ด ํฉ์ณ์ก๋ค๋ ์๋ฏธ๋ก ์ด์ ์นธ์ ๋ธ๋ก ์ซ์๋ฅผ ๋ ๋ฐฐ๋ก ๋ฐ๊ฟ์ฃผ๊ณ , ํ์ฌ ์นธ์ ๋น์์ค ๋ค์, ์ด์ ์นธ์ ๊ฐ๋ฅดํค๋ ์ธ๋ฑ์ค๋ ํ๋๋ฅผ ์ฆ๊ฐ์ํจ๋ค. ์๋ฅผ ๋ค์ด ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ํฉ์น ์ (์ด์ ์นธ, ํ์ฌ ์นธ, ๋ค์ ์นธ)์ด (4, 4, 8)๋ก ์์ ๋, ๊ฒฐ๊ณผ๊ฐ (8, 8)์ด ๋์ง ์๊ณ (16)์ผ๋ก ๋ชฝ๋ ํฉ์ณ์ง๋ ๊ฒฝ์ฐ๋ฅผ ๋ง๊ธฐ ์ํจ์ด๋ค.
โป๏ธ ์ด์ ์นธ์ ์ง๊ธ ๋ธ๋ก๊ณผ ๋ค๋ฅธ ๋ธ๋ก์ด ์์ผ๋ฉด
์ด์ ์นธ์ ๋ ์ด์ ๋ณผ ํ์๊ฐ ์๋ ์นธ์ด ๋๋ค. ๋ฐ๋ผ์ ์ด์ ์นธ์ ๊ฐ๋ฅดํค๋ ์ธ๋ฑ์ค๋ฅผ ํ๋ ์ฆ๊ฐ์ํจ ๋ค์ ๊ทธ ์์น๋ก ์ง๊ธ ๋ธ๋ก์ ์ฎ๊ธด ํ ์ง๊ธ ์๋ฆฌ๋ฅผ ๋น์์ค๋ค. ๋จ, ์ง๊ธ ์๋ฆฌ๋ฅผ ๋น์ธ ๋์๋ ๋ธ๋ก์ ์์น๊ฐ ์ฎ๊ฒจ์ง์ง ์๋ ๊ฒฝ์ฐ์ธ์ง ์ฒดํฌ๊ฐ ํ์ํ๋ค.
๐โ๏ธ ์๊ฒฌ
๊ณจ๋ 2 ์ด์ ๋๋ฉด ์ง์ง.................์ด๋ง์ด๋งํ๊ฒ ์ํฉ์ ์๊ฐํ๊ณ ์ผ์ด์ค๋ฅผ ๋๋๊ณ ์ธ์ฌํ๊ฒ ์ฝ๋๋ฅผ ์ง์ผํ๋ ๊ฒ ๊ฐ๋ค.
๋๋ฒ๊น ํ๋๋ฐ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ ธ๋๋ฐ(printํ๋ ํจ์๋ ๋ฐ๋ก ์ง๊ณ ), ํ๊ณ ๋๋๊น ๋ฟ๋ฏํ๋ค.
์์ฌ์ด ์ ์.....์ผ์ด์ค๋ง๋ค ์ฝ๋๋ ๋น์ทํด์ ๋ณ์๋ง ๋ฐ๊ฟ์ฃผ๊ณ ์ฌํ์ฉํ๋ ์ฝ๋ ํ๋๋ก ๋ฑ ํฉ์น ์ ์์ ๋ฏ ํ ๊ฒ? ์์ง ๋ด ๊น๋ฅ์ด ๊ฑฐ๊ธฐ๊น์ง ์๋๋ ๊ฒ๋ ์๊ณ , ์คํฐ๋ ์๊ฐ์ ์ซ๊ธฐ๋๋ผ ๊ทธ๋ฅ ์ฌ๊ธฐ์ ๋๋๋ค... ๐ญ
๐ป ์์ค์ฝ๋: ์๋ฐ(Java)
/** https://www.acmicpc.net/problem/12100 */
public class Main_๋ฐฑ์ค_12100_2048_๊ณจ๋2 {
static int N, result=-1;
static int[][] map;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
map = new int[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}//input
dfs(0);
System.out.println(result);
}//end of main
private static void dfs(int cnt) {
if(cnt==5) {
result = Math.max(result, getMaxNum(map));
return;
}
// temp: cnt๋จ๊ณ์ ์ด๊ธฐ map๋ฐฐ์ด ์ํ๋ฅผ ์ ์ฅํด๋๊ธฐ ์ํจ
int[][] temp = new int[N][N];
copyArray(temp, map);// temp<-map
for (int i = 0; i < 4; i++) {
switch(i) {
case 0:
up(map);
break;
case 1:
down(map);
break;
case 2:
left(map);
break;
case 3:
right(map);
break;
}
dfs(cnt+1);
copyArray(map, temp);// map<-temp
}
}//end of dfs
private static void print(int[][] map) {
for (int i = 0; i < N; i++) {
System.out.println(Arrays.toString(map[i]));
}
System.out.println("===================================");
}//end of print
private static void copyArray(int[][] to, int[][] from) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
to[i][j] = from[i][j];
}
}
}//end of copyArray
private static int getMaxNum(int[][] map) {
int max = map[0][0];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
max = Math.max(max, map[i][j]);
}
}
return max;
}//end of getMaxNum
private static void up(int[][] map) {
for (int i = 0; i < N; i++) { //0~N-1์ด
int idx = 0;
for (int j = 1; j < N; j++) { //1~N-1ํ
int before = map[idx][i];
int now = map[j][i];
if(now!=0) {
// ์ด์ ์นธ์ด ๋น ๊ณณ์ด๋ฉด ๊ทธ ๊ณณ์ผ๋ก ๋น๊ฒจ๊ฐ๋ค
if(before==0) {
map[idx][i] = now;
map[j][i] = 0;
}
// ์ด์ ์นธ์ ์ซ์๊ฐ ์๊ณ , ๊ทธ ์ซ์๊ฐ ์ง๊ธ ์นธ๊ณผ ๊ฐ์ผ๋ฉด
else if(before==now) {
map[idx][i] *= 2;
map[j][i] = 0;
idx ++;
}
// ์ด์ ์นธ์ ์ซ์๊ฐ ์์ง๋ง ์ง๊ธ ์นธ๊ณผ ๋ค๋ฅด๋ฉด
else {
idx ++;
map[idx][i] = map[j][i];
if(idx!=j) map[j][i] = 0;
}
}
}
}
}//end of up
private static void down(int[][] map) {
for (int i = 0; i < N; i++) { //0~N-1์ด
int idx = N-1;
for (int j = N-2; j >= 0; j--) { //1~N-1ํ
int before = map[idx][i];
int now = map[j][i];
if(now!=0) {
// ์ด์ ์นธ์ด ๋น ๊ณณ์ด๋ฉด ๊ทธ ๊ณณ์ผ๋ก ๋น๊ฒจ๊ฐ๋ค
if(before==0) {
map[idx][i] = now;
map[j][i] = 0;
}
// ์ด์ ์นธ์ ์ซ์๊ฐ ์๊ณ , ๊ทธ ์ซ์๊ฐ ์ง๊ธ ์นธ๊ณผ ๊ฐ์ผ๋ฉด
else if(before==map[j][i]) {
map[idx][i] *= 2;
map[j][i] = 0;
idx --;
}
// ์ด์ ์นธ์ ์ซ์๊ฐ ์์ง๋ง ์ง๊ธ ์นธ๊ณผ ๋ค๋ฅด๋ฉด
else {
idx --;
map[idx][i] = map[j][i];
if(idx!=j) map[j][i] = 0;
}
}
}
}
}//end of down
private static void left(int[][] map) {
for (int i = 0; i < N; i++) { //0~N-1ํ
int idx = 0;
for (int j = 1; j < N; j++) { //1~N-1์ด
int before = map[i][idx];
int now = map[i][j];
if(now!=0) {
// ์ด์ ์นธ์ด ๋น ๊ณณ์ด๋ฉด ๊ทธ ๊ณณ์ผ๋ก ๋น๊ฒจ๊ฐ๋ค
if(before==0) {
map[i][idx] = now;
map[i][j] = 0;
}
// ์ด์ ์นธ์ ์ซ์๊ฐ ์๊ณ , ๊ทธ ์ซ์๊ฐ ์ง๊ธ ์นธ๊ณผ ๊ฐ์ผ๋ฉด
else if(before==map[i][j]) {
map[i][idx] *= 2;
map[i][j] = 0;
idx ++;
}
// ์ด์ ์นธ์ ์ซ์๊ฐ ์์ง๋ง ์ง๊ธ ์นธ๊ณผ ๋ค๋ฅด๋ฉด
else {
idx ++;
map[i][idx] = map[i][j];
if(idx!=j) map[i][j] = 0;
}
}
}
}
}//end of left
private static void right(int[][] map) {
for (int i = 0; i < N; i++) { //0~N-1ํ
int idx = N-1;
for (int j = N-2; j >= 0; j--) { //1~N-1์ด
int before = map[i][idx];
int now = map[i][j];
if(now!=0) {
// ์ด์ ์นธ์ด ๋น ๊ณณ์ด๋ฉด ๊ทธ ๊ณณ์ผ๋ก ๋น๊ฒจ๊ฐ๋ค
if(before==0) {
map[i][idx] = now;
map[i][j] = 0;
}
// ์ด์ ์นธ์ ์ซ์๊ฐ ์๊ณ , ๊ทธ ์ซ์๊ฐ ์ง๊ธ ์นธ๊ณผ ๊ฐ์ผ๋ฉด
else if(before==map[i][j]) {
map[i][idx] *= 2;
map[i][j] = 0;
idx --;
}
// ์ด์ ์นธ์ ์ซ์๊ฐ ์์ง๋ง ์ง๊ธ ์นธ๊ณผ ๋ค๋ฅด๋ฉด
else {
idx --;
map[i][idx] = map[i][j];
if(idx!=j) map[i][j] = 0;
}
}
}
}
}//end of right
}//end of classโ
๐ ๐ ๐
๏ผฐ๏ฝ๏ฝ๏ฝ๏ฝ ๏ฝ ๏ผข๏ฝ ๏ผณ๏ผก๏ผน
๐๐ฉ๐ข๐ฏ๐ฌ๐ด ๐ง๐ฐ๐ณ ๐ณ๐ฆ๐ข๐ฅ๐ช๐ฏ๐จ