12100 2048(Easy) - 삼성 sw 역량 기출
4 * 4 보드에서 블록을 상하좌우로 이동시킨다. 이 때, 같은 값을 같는 블록이 충돌하면 두 블록은 하나로 합쳐지고 값이 더해지게 된다.
한 번 이동에서 이미 합쳐진 블록은 더이상 합쳐지지 않는다.
최대 5번 이동해서 만들 수 있는 가장 큰 블록의 값은?
-
방향대로 합쳐지는 것 구현
한 번 시간에 두번 합쳐지는 것이 불가능하므로 합친 후에 break를 해줌
처음에는 +1한 것이 같으면 합쳐지게 구현했는데 0 일 경우가 있으므로 현재 좌표다음 부터 for문을 돌면서
-
0이 아니고, 같은게 있으면 *2해주고 같은 것이 있던 좌표는 0으로 변경해준후 break;
-
0이 아니고 다르면 그냥 break;
-
-
모두 합친 후 방향에 따라서 0 자리를 채워줌
밀리는 방향 반대로 돌면서 현재 좌표가 0이라면 다음 좌표부터 탐색하며 최초로 0이 아닌 값과 swap해줌 - gravity
swap 후 break;
-
모든 경우의 수 구현
각 방향으로 미는 경우 전에 맵을 복사한 후 복사한 맵으로 재귀 탐색을 할 수 있도록 구현
-
5번 민 후 맵 상태를 검사하여 가장 큰 값 리턴
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main2048 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine().trim());
int[][] block = new int[N][N];
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine().trim(), " ");
for(int j = 0; j < N; j++) {
block[i][j] = Integer.parseInt(st.nextToken());
}
}
ans = 0;
power(block, 0);
System.out.println(ans);
}
static int ans;
static void power(int[][] block, int cnt) {
if(cnt == 5) {
int max = 0;
for(int i = 0; i < block.length; i++) {
for(int j = 0; j < block.length; j++) {
max = Math.max(max, block[i][j]);
}
}
ans = Math.max(max, ans);
return;
}
int[][] copy = new int[block.length][block.length];
copyMap(block, copy);
move(copy, 0);
power(copy, cnt+1);
copyMap(block, copy);
move(copy, 1);
power(copy, cnt+1);
copyMap(block, copy);
move(copy, 2);
power(copy, cnt+1);
copyMap(block, copy);
move(copy, 3);
power(copy, cnt+1);
}
static void copyMap(int[][] block, int[][] copy) {
for(int i = 0; i< block.length; i++) {
for(int j = 0; j < block.length; j++) {
copy[i][j] = block[i][j];
}
}
}
// 상 0 하 1 좌 2 우 3
static void move(int[][] block, int dir) {
if(dir == 0) {
for(int j = 0; j < block.length; j++) {
for(int i = 0; i < block.length-1; i++) {
if(block[i][j]!=0) {
for(int k = i+1; k < block.length; k++) {
if(block[k][j]!=0) {
if(block[i][j] == block[k][j]) {
block[i][j] *= 2;
block[k][j] = 0;
break;
}else {
break;
}
}
}
}
}
gravityUp(block, j);
}
}else if(dir == 1) {
for(int j = 0; j < block.length; j++) {
for(int i = block.length-1; i > 0; i--) {
if(block[i][j]!=0) {
for(int k = i-1; k >= 0; k--) {
if(block[k][j]!=0) {
if(block[i][j] == block[k][j]) {
block[i][j] *= 2;
block[k][j] = 0;
break;
}else {
break;
}
}
}
}
}
gravityDown(block, j);
}
}else if(dir == 2) {
for(int i = 0; i < block.length; i++) {
for(int j = 0; j < block.length-1; j++) {
if(block[i][j]!=0) {
for(int k = j+1; k < block.length; k++) {
if(block[i][k]!=0) {
if(block[i][j] == block[i][k]) {
block[i][j] *= 2;
block[i][k] = 0;
break;
}else
break;
}
}
}
}
gravityLeft(block, i);
}
}else if(dir == 3) {
for(int i = 0; i < block.length; i++) {
for(int j = block.length-1; j > 0; j--) {
if(block[i][j]!=0) {
for(int k = j-1; k >= 0; k--) {
if(block[i][k]!=0) {
if(block[i][j] == block[i][k]) {
block[i][j] *= 2;
block[i][k] = 0;
break;
}else
break;
}
}
}
}
gravityRight(block, i);
}
}
}
static void gravityUp(int[][] block, int x) {
for(int i = 0; i < block.length-1; i++) {
if(block[i][x] == 0) {
for(int j = i+1; j < block.length; j++) {
if(block[j][x] != 0) {
int tmp = block[i][x];
block[i][x] = block[j][x];
block[j][x] = tmp;
break;
}
}
}
}
}
static void gravityDown(int[][] block, int x) {
for(int i = block.length-1; i > 0; i--) {
if(block[i][x] == 0) {
for(int j = i-1; j >= 0; j--) {
if(block[j][x] != 0) {
int tmp = block[i][x];
block[i][x] = block[j][x];
block[j][x] = tmp;
break;
}
}
}
}
}
static void gravityLeft(int[][] block, int y) {
for(int i = 0; i < block.length-1; i++) {
if(block[y][i] == 0) {
for(int j = i+1; j < block.length; j++) {
if(block[y][j] != 0) {
int tmp = block[y][i];
block[y][i] = block[y][j];
block[y][j] = tmp;
break;
}
}
}
}
}
static void gravityRight(int[][] block, int y) {
for(int i = block.length-1; i > 0; i--) {
if(block[y][i] == 0) {
for(int j = i-1; j >= 0; j--) {
if(block[y][j] != 0) {
int tmp = block[y][i];
block[y][i] = block[y][j];
block[y][j] = tmp;
break;
}
}
}
}
}
}