백준 [12100] 2048(Easy)
문제보기
풀이
- direction() : 어느 방향으로 움직일지 5번의 방향을 결정.
- findBigNum() : 결정한 방향대로 움직이는데 주의할점은 map=newMap;을 해서 움직인 기록 남기기.
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int ans, N;
static int[][] origin;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
origin = new int[N][N];
ans = 0;
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
origin[i][j] = Integer.parseInt(st.nextToken());
ans = Math.max(origin[i][j], ans);
}
}
direction(0, new int[5]);
System.out.println(ans);
}
public static void direction(int cnt, int[] dir) {
if (cnt >= 5) {
int[][] copyMap = new int[N][N];
for(int i=0; i<N; i++) {
copyMap[i] = origin[i].clone();
}
findBigNum(dir, copyMap);
return;
}
// 0:상, 1:하, 2:좌, 3:우
for (int k = 0; k < 4; k++) {
dir[cnt] = k;
direction(cnt + 1, dir);
}
}
public static void findBigNum(int[] dir, int[][] map) {
for (int k = 0; k < 5; k++) {
int[][] newMap = new int[N][N];
// 상
if (dir[k] == 0) {
for (int i = 0; i < N; i++) {
int idx = 0;
for (int j = 0; j < N; j++) {
if (map[j][i] != 0) {
if (newMap[idx][i] == 0 || idx == j)
newMap[idx][i] = map[j][i];
else {
int x = map[j][i] + newMap[idx][i];
if ((x != 0) && ((x & (x - 1)) == 0)) { // 2의 제곱체크
newMap[idx][i] = x;
ans = Math.max(ans, x);
idx++;
} else {
idx++;
newMap[idx][i] = map[j][i];
}
}
}
}
}
}
// 하
if (dir[k] == 1) {
for (int i = 0; i < N; i++) {
int idx = N - 1;
for (int j = N - 1; j >= 0; j--) {
if (map[j][i] != 0) {
if (newMap[idx][i] == 0 || idx == j)
newMap[idx][i] = map[j][i];
else {
int x = map[j][i] + newMap[idx][i];
if ((x != 0) && ((x & (x - 1)) == 0)) { // 2의 제곱체크
newMap[idx][i] = x;
ans = Math.max(ans, x);
idx--;
} else {
idx--;
newMap[idx][i] = map[j][i];
}
}
}
}
}
}
// 좌
if (dir[k] == 2) {
for (int i = 0; i < N; i++) {
int idx = 0;
for (int j = 0; j < N; j++) {
if (map[i][j] != 0) {
if (newMap[i][idx] == 0 || idx == j)
newMap[i][idx] = map[i][j];
else {
int x = map[i][j] + newMap[i][idx];
if ((x != 0) && ((x & (x - 1)) == 0)) { // 2의 제곱체크
newMap[i][idx] = x;
ans = Math.max(ans, x);
idx++;
} else {
idx++;
newMap[i][idx] = map[i][j];
}
}
}
}
}
}
// 우
if (dir[k] == 3) {
for (int i = 0; i < N; i++) {
int idx = N - 1;
for (int j = N - 1; j >= 0; j--) {
if (map[i][j] != 0) {
if (newMap[i][idx] == 0 || idx == j)
newMap[i][idx] = map[i][j];
else {
int x = map[i][j] + newMap[i][idx];
if ((x != 0) && ((x & (x - 1)) == 0)) { // 2의 제곱체크
newMap[i][idx] = x;
ans = Math.max(ans, x);
idx--;
} else {
idx--;
newMap[i][idx] = map[i][j];
}
}
}
}
}
}
map = newMap;
}
}
}