https://www.acmicpc.net/problem/12100
๋ฌธ์
2048 ๊ฒ์์ 4×4 ํฌ๊ธฐ์ ๋ณด๋์์ ํผ์ ์ฆ๊ธฐ๋ ์ฌ๋ฏธ์๋ ๊ฒ์์ด๋ค. ์ด ๋งํฌ๋ฅผ ๋๋ฅด๋ฉด ๊ฒ์์ ํด๋ณผ ์ ์๋ค.
์ด ๊ฒ์์์ ํ ๋ฒ์ ์ด๋์ ๋ณด๋ ์์ ์๋ ์ ์ฒด ๋ธ๋ก์ ์ํ์ข์ฐ ๋ค ๋ฐฉํฅ ์ค ํ๋๋ก ์ด๋์ํค๋ ๊ฒ์ด๋ค. ์ด๋, ๊ฐ์ ๊ฐ์ ๊ฐ๋ ๋ ๋ธ๋ก์ด ์ถฉ๋ํ๋ฉด ๋ ๋ธ๋ก์ ํ๋๋ก ํฉ์ณ์ง๊ฒ ๋๋ค. ํ ๋ฒ์ ์ด๋์์ ์ด๋ฏธ ํฉ์ณ์ง ๋ธ๋ก์ ๋ ๋ค๋ฅธ ๋ธ๋ก๊ณผ ๋ค์ ํฉ์ณ์ง ์ ์๋ค. (์ค์ ๊ฒ์์์๋ ์ด๋์ ํ ๋ฒ ํ ๋๋ง๋ค ๋ธ๋ก์ด ์ถ๊ฐ๋์ง๋ง, ์ด ๋ฌธ์ ์์ ๋ธ๋ก์ด ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ๋ ์๋ค)
<๊ทธ๋ฆผ 1>์ ๊ฒฝ์ฐ์์ ์๋ก ๋ธ๋ก์ ์ด๋์ํค๋ฉด <๊ทธ๋ฆผ 2>์ ์ํ๊ฐ ๋๋ค. ์ฌ๊ธฐ์, ์ผ์ชฝ์ผ๋ก ๋ธ๋ก์ ์ด๋์ํค๋ฉด <๊ทธ๋ฆผ 3>์ ์ํ๊ฐ ๋๋ค.
<๊ทธ๋ฆผ 4>์ ์ํ์์ ๋ธ๋ก์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋์ํค๋ฉด <๊ทธ๋ฆผ 5>๊ฐ ๋๊ณ , ์ฌ๊ธฐ์ ๋ค์ ์๋ก ๋ธ๋ก์ ์ด๋์ํค๋ฉด <๊ทธ๋ฆผ 6>์ด ๋๋ค. ์ฌ๊ธฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ธ๋ก์ ์ด๋์์ผ <๊ทธ๋ฆผ 7>์ ๋ง๋ค ์ ์๋ค.
<๊ทธ๋ฆผ 8>์ ์ํ์์ ์ผ์ชฝ์ผ๋ก ๋ธ๋ก์ ์ฎ๊ธฐ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? 2๊ฐ ์ถฉ๋ํ๊ธฐ ๋๋ฌธ์, 4๋ก ํฉ์ณ์ง๊ฒ ๋๊ณ <๊ทธ๋ฆผ 9>์ ์ํ๊ฐ ๋๋ค.
<๊ทธ๋ฆผ 10>์์ ์๋ก ๋ธ๋ก์ ์ด๋์ํค๋ฉด <๊ทธ๋ฆผ 11>์ ์ํ๊ฐ ๋๋ค.
<๊ทธ๋ฆผ 12>์ ๊ฒฝ์ฐ์ ์๋ก ๋ธ๋ก์ ์ด๋์ํค๋ฉด <๊ทธ๋ฆผ 13>์ ์ํ๊ฐ ๋๋๋ฐ, ๊ทธ ์ด์ ๋ ํ ๋ฒ์ ์ด๋์์ ์ด๋ฏธ ํฉ์ณ์ง ๋ธ๋ก์ ๋ ํฉ์ณ์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ง๋ง์ผ๋ก, ๋๊ฐ์ ์๊ฐ ์ธ ๊ฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ด๋ํ๋ ค๊ณ ํ๋ ์ชฝ์ ์นธ์ด ๋จผ์ ํฉ์ณ์ง๋ค. ์๋ฅผ ๋ค์ด, ์๋ก ์ด๋์ํค๋ ๊ฒฝ์ฐ์๋ ์์ชฝ์ ์๋ ๋ธ๋ก์ด ๋จผ์ ํฉ์ณ์ง๊ฒ ๋๋ค. <๊ทธ๋ฆผ 14>์ ๊ฒฝ์ฐ์ ์๋ก ์ด๋ํ๋ฉด <๊ทธ๋ฆผ 15>๋ฅผ ๋ง๋ ๋ค.
์ด ๋ฌธ์ ์์ ๋ค๋ฃจ๋ 2048 ๊ฒ์์ ๋ณด๋์ ํฌ๊ธฐ๊ฐ N×N ์ด๋ค. ๋ณด๋์ ํฌ๊ธฐ์ ๋ณด๋ํ์ ๋ธ๋ก ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, ์ต๋ 5๋ฒ ์ด๋ํด์ ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ํฐ ๋ธ๋ก์ ๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ณด๋์ ํฌ๊ธฐ N (1 ≤ N ≤ 20)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๊ฒ์ํ์ ์ด๊ธฐ ์ํ๊ฐ ์ฃผ์ด์ง๋ค. 0์ ๋น ์นธ์ ๋ํ๋ด๋ฉฐ, ์ด์ธ์ ๊ฐ์ ๋ชจ๋ ๋ธ๋ก์ ๋ํ๋ธ๋ค. ๋ธ๋ก์ ์ฐ์ฌ ์๋ ์๋ 2๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 1024๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ 2์ ์ ๊ณฑ๊ผด์ด๋ค. ๋ธ๋ก์ ์ ์ด๋ ํ๋ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ต๋ 5๋ฒ ์ด๋์์ผ์ ์ป์ ์ ์๋ ๊ฐ์ฅ ํฐ ๋ธ๋ก์ ์ถ๋ ฅํ๋ค.
ํ์ด
solution(int cnt)
ํจ์๊ฐ ๋ฉ์ธ ํจ์์ด๋ค.
cnt๊ฐ 5๊ฐ ๋ ๋๊น์ง ๋ธ๋ก๋ค์ ์ด๋์ํจ๋ค
โ ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ์ต์ด ๋ณด๋์ ์ ๋ณด๋ฅผ ๋ฏธ๋ฆฌ ์ ์ฅํด๋์์ผ ํ๋ค!!
for(int i = 0; i < 4; i++) ๋ฅผ ๋๋ฉด์, move(i)
ํจ์๋ก ๊ฐ ๋ฐฉํฅ์ผ๋ก ์ด๋์ํจ๋ค.
move(int dir)
- dir
- 0 : ์์ชฝ
์ ๋ธ๋ก๋ถํฐ ์ด๋ - 1 : ์ผ์ชฝ
์ผ์ชฝ ๋ธ๋ก๋ถํฐ ์ด๋ - 2 : ์ค๋ฅธ์ชฝ
์ค๋ฅธ์ชฝ ๋ธ๋ก๋ถํฐ ์ด๋ - 3 : ์๋ซ์ชฝ
๋ฐ ๋ธ๋ก๋ถํฐ ์ด๋
- 0 : ์์ชฝ
์ฌ๊ธฐ์ ๊ฐ ๋ธ๋ก๋ค์ moveBlock(int x, int y, int dir)
ํจ์๋ก ์ด๋๋๋ค.
์ค์ํ ๊ฒ์ x์ y ์์์ด๋ค.
์์ชฝ๊ณผ ์๋ซ์ชฝ์ for๋ฌธ ์์๊ฐ ํ → ์ด์ด๊ณ ,
์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ for๋ฌธ ์์๊ฐ ์ด → ํ์ด๋ค.
board[x][y]
์ ๋ธ๋ก์ด ์ด๋ํ๋๋ฐ,
- ๋น ๊ณต๊ฐ(0)์ด๋ผ๋ฉด ์ข ๋ฃ
- ์๋๋ผ๋ฉด, dir๋ฐฉํฅ(nx, ny)์ผ๋ก ์ด๋
- (nx, ny)๊ฐ ๋ฒ์ ๋ฐ์ด๋ผ๋ฉด ์ข ๋ฃ
- (nx, ny)๊ฐ ์ด๋ฏธ ์์์ ํฉ์ณ์ง ๋ธ๋ญ์ด๋ผ๋ฉด ์ข ๋ฃ
- 1,2๋ฒ ๋๋ค ๋ง์กฑํ์ง ์๊ณ , (x,y)๋ธ๋ก๊ณผ (nx,ny)๋ธ๋ก์ด ๊ฐ๋ค๋ฉด ํฉ์ณ์ฃผ๊ณ ์ข ๋ฃ
- 1,2,3๋ฒ ์ ๋ถ ์๋๊ณ , ๋ค๋ฅธ ๋ธ๋ก์ด ์กด์ฌํ๋ค๋ฉด ์ข ๋ฃ
- 1,2,3,4๋ฒ ์ ๋ถ ์๋๊ณ , ๋น ๊ณต๊ฐ์ด๋ผ๋ฉด ์ด๋
- ์ข ๋ฃ๋ ๋๊น์ง ์ด๋์ ๋ฐ๋ณตํด์ค๋ค.
์ด๋ ๊ฒ ๋ธ๋ก๋ค์ 5๋ฒ ์ด๋์์ผ์ฃผ์๋ค๋ฉด (cnt == 5)
๋ธ๋ก์ ์ต๋๊ฐ์ ์ ์ฅ โผ๏ธ
์๊ฐ๋ณด๋ค ๊ฐ๋จํ๋๋ฐ,,,, ์ด๋์ํค๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๊ธฐ๊น์ง๊ฐ ๋๋ฌด ์ด๋ ค์๋นใ ใ ๐ญใ ใ
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class n_12100_2048_Easy {
static int N, answer;
static int[][] board;
static boolean[][] isVisited;
static int[] dx = {-1, 0, 0, 1};
static int[] dy = {0, -1, 1, 0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
answer = Integer.MIN_VALUE;
N = Integer.parseInt(br.readLine());
board = new int[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
}
}
solution(0);
System.out.println(answer);
}
private static void solution(int cnt) {
if (cnt == 5) {
findMax();
return;
}
int[][] copyBoard = new int[N][N];
for(int i = 0; i < N; i++) copyBoard[i] = board[i].clone();
for (int i = 0; i < 4; i++) {
move(i);
solution(cnt + 1);
for (int j = 0; j < N; j++) board[j] = copyBoard[j].clone();
}
}
private static void findMax() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(answer < board[i][j]) answer = board[i][j];
}
}
}
private static void move(int dir) {
isVisited = new boolean[N][N];
switch (dir) {
case 0:
//up
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
moveBlock(i, j, dir);
}
}
break;
case 1:
//left
for (int j = 0; j < N; j++) {
for (int i = 0; i < N; i++) {
moveBlock(i,j,dir);
}
}
break;
case 2:
//right
for (int j = N - 1; j >= 0; j--) {
for (int i = 0; i < N; i++) {
moveBlock(i, j, dir);
}
}
break;
case 3:
//down
for (int i = N - 1; i >= 0; i--) {
for (int j = 0; j < N; j++) {
moveBlock(i, j, dir);
}
}
}
}
private static void moveBlock(int x, int y, int dir) {
if(board[x][y] == 0) return;
while (true) {
int nx = x + dx[dir];
int ny = y + dy[dir];
if(nx < 0 || ny < 0 || N <= nx || N <= ny) return;
if(isVisited[nx][ny]) return;
if(board[x][y] == board[nx][ny]){
isVisited[nx][ny] = true;
board[nx][ny] *= 2;
board[x][y] = 0;
return;
}else if(board[nx][ny] != 0) return;
board[nx][ny] = board[x][y];
board[x][y] = 0;
x = nx;
y = ny;
}
}
}
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ BOJ 2478 ] ์๋ฌผ์ (1) | 2023.11.06 |
---|---|
[ BOJ / ๋ฐฑ์ค 17825 ] ์ฃผ์ฌ์ ์ท๋์ด ( ์๋ฐ / JAVA ) (0) | 2022.04.15 |
[ ๋ฐฑ์ค / BOJ 14594 ] ๋๋ฐฉ ํ๋ก์ ํธ - Small ( ์๋ฐ / JAVA ) (0) | 2022.03.08 |
[ ๋ฐฑ์ค / BOJ 13460 ] ๊ตฌ์ฌ ํ์ถ 2 ( ์๋ฐ / JAVA ) (0) | 2022.03.06 |
[ ๋ฐฑ์ค / BOJ 22861 ] ํด๋ ์ ๋ฆฌ - large ( JAVA / ์๋ฐ ) (0) | 2022.02.22 |