[Java] 백준 12100번 2048 (Easy)

2022. 4. 26. 22:42
728x90

https://www.acmicpc.net/problem/12100

 

12100번: 2048 (Easy)

첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2

www.acmicpc.net

문제


 

코드 리뷰


이번 문제는 시뮬레이션 문제인데 난이도가 골드 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

반응형

BELATED ARTICLES

more