[Java] 백준 12100번 2048 (Easy)
2022. 4. 26. 22:42
728x90
https://www.acmicpc.net/problem/12100
문제
코드 리뷰
이번 문제는 시뮬레이션 문제인데 난이도가 골드 2인 문제입니다.
난이도를 보고 많이 쫄아서 어캐 풀지 했는데 생각보다 풀만했던? 문제였습니다.
문제를 풀면서 clone기능을 배웠는데 아주 편리한것 같습니다.
문제는 상하좌우로 숫자들을 끝까지 이동시키는 것입니다.
이동시킬때 같은 숫자가 있을 경우 두 숫자의 합을 이동방향 끝에 저장합니다.
한번 이동할 때 합쳐진 숫자는 다시 이동하기 전까지는 합쳐지지 않습니다.
조금 햇갈렸던 것은 오른쪽 또는 아래로 숫자들이 이동할 때 첫 숫자의 시작을 끝 부터해야합니다.
제가 공간능력이 좀 부족한가 봅니다. 엄청 헷갈렸습니다.
이동시킬때는 index와 block을 사용하여 block에는 합쳐지지 못하여 합쳐져야 하는 값을 저장하였고
index는 처음위치부터 마지막까지의 위치를 차근차근 저장하여 끝까지 가게합니다.
코드 분석하겠습니다.
package BJ;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BJ_2048Easy {
static int N;
static int[][] map;
static int result;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
map = new int[N][N];
StringTokenizer st;
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());
}
}
game(0);
System.out.println(result);
}
private static void game(int index) {
if (index == 5) {
findMax();
return;
}
int copy[][] = new int[N][N];
for (int i = 0; i < N; i++) {
copy[i] = map[i].clone();
}
for (int i = 0; i < 4; i++) {
move(i);
game(index + 1);
for (int j = 0; j < N; j++) {
map[j] = copy[j].clone();
}
}
}
private static void findMax() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (map[i][j] != 0) {
result = Math.max(result, map[i][j]);
}
}
}
}
private static void move(int dir) {
switch (dir) {
case 0: // 위
for (int i = 0; i < N; i++) {
int index = 0;
int block = 0;
for (int j = 0; j < N; j++) {
if (map[j][i] != 0) {
if (block == map[j][i]) { // 값이 같을 경우
map[index - 1][i] = block * 2; // 위에 있는 값의 * 2
block = 0; // 값 0으로 초기화
map[j][i] = 0; // map 값 초기화
} else { // 값이 다를 경우, 아무값이 없을 경우
block = map[j][i]; // block에 값을 넣음
map[j][i] = 0; // map값 초기화
map[index][i] = block; // block 값을 합치기 이전까지 가장 위로 올림
index++; // 바로 밑으로 index 변경
}
}
}
}
break;
case 1: // 좌
for (int i = 0; i < N; i++) {
int index = 0;
int block = 0;
for (int j = 0; j < N; j++) {
if (map[i][j] != 0) {
if (block == map[i][j]) {
map[i][index - 1] = block * 2;
block = 0;
map[i][j] = 0;
} else {
block = map[i][j];
map[i][j] = 0;
map[i][index] = block;
index++;
}
}
}
}
break;
case 2: // 하
for (int i = 0; i < N; i++) {
int index = N - 1;
int block = 0;
for (int j = N - 1; j >= 0; j--) {
if (map[j][i] != 0) {
if (block == map[j][i]) {
map[index + 1][i] = block * 2;
block = 0;
map[j][i] = 0;
} else {
block = map[j][i];
map[j][i] = 0;
map[index][i] = block;
index--;
}
}
}
}
break;
case 3: // 우
for (int i = 0; i < N; i++) {
int index = N - 1;
int block = 0;
for (int j = N - 1; j >= 0; j--) {
if (map[i][j] != 0) {
if (map[i][j] == block) {
map[i][index + 1] = block * 2;
block = 0;
map[i][j] = 0;
} else {
block = map[i][j];
map[i][j] = 0;
map[i][index] = block;
index--;
}
}
}
}
break;
}
}
}
Ysik Github : https://github.com/Y1sik/Algorithm/blob/main/BJ/BJ_2048Easy.java
반응형
'알고리즘' 카테고리의 다른 글
[Java] 백준 16235번 나무 재테크 (0) | 2022.04.28 |
---|---|
[Java] 백준 15683번 감시 (0) | 2022.04.27 |
[Java] 백준 18405번 경쟁적 전염 (0) | 2022.04.25 |
[Java] 백준 10987번 모음의 개수 (0) | 2022.04.25 |
[Java] 백준 20055번 컨베이어 벨트 위의 로봇 (0) | 2022.04.25 |