본문 바로가기

알고리즘

[BOJ] 12100번 : 2048(Easy) (JAVA)

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

 

12100번: 2048 (Easy)

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

www.acmicpc.net

1. 상,하,좌,우 이동에 따른 map을 계속 저장하며 dfs를 수행한다.

2. 이동횟수 5번이 되면 return

3. 최종적으로 MAX 값을 출력한다.

move method는 이 방식으로 동작한다.

import java.util.*;
import java.io.*;

public class Main
{
    static int N;
    static int map[][];
    static int MAX;

    static void dfs(int[][] input, int cnt){
        //5번 이동했으면 종료
        if(cnt==5){
            return;
        }
        for(int d=0;d<4;d++){
            int[][] moved = move(input,d);
            dfs(moved,cnt+1);
        }
    }
    static int[][] move(int[][] input,int d){
        int[][] after = new int[N][N];

        switch (d){
            case 0: //위
                for(int i=0;i<N;i++){
                    int tmp = -1; //이전 숫자
                    int nxt = 0; //시작 인덱스
                    for(int j=0;j<N;j++){
                        if(input[j][i]==0) {
                            continue;
                        }
                        else {
                            if (tmp == input[j][i]) {
                                after[nxt - 1][i] = input[j][i] * 2;
                                tmp = -1;
                                MAX = Math.max(MAX,after[nxt - 1][i]);
                            } else {
                                after[nxt][i] = input[j][i];
                                tmp = input[j][i];
                                nxt++;
                            }
                        }
                    }
                }
                break;
            case 1: //아래
                for(int i=0;i<N;i++){
                    int tmp = -1; //이전 숫자
                    int nxt = N-1; //시작 인덱스
                    for(int j=N-1;j>=0;j--){
                        if(input[j][i]==0) continue;
                        else {
                            if (tmp == input[j][i]) {
                                after[nxt + 1][i] = input[j][i] * 2;
                                tmp = -1;
                                MAX = Math.max(MAX,after[nxt + 1][i]);
                            } else {
                                after[nxt][i] = input[j][i];
                                tmp = input[j][i];
                                nxt--;
                            }
                        }
                    }
                }
                break;
            case 2: //왼
                for(int i=0;i<N;i++){
                    int tmp = -1; //이전 숫자
                    int nxt = 0; //시작 인덱스
                    for(int j=0;j<N;j++){
                        if(input[i][j]==0) continue;
                        else {
                            if (tmp == input[i][j]) {
                                after[i][nxt - 1] = input[i][j] * 2;
                                tmp = -1;
                                MAX = Math.max(MAX,after[i][nxt - 1]);
                            } else {
                                after[i][nxt] = input[i][j];
                                tmp = input[i][j];
                                nxt++;
                            }
                        }
                    }
                }
                break;
            case 3: //오
                for(int i=0;i<N;i++){
                    int tmp = -1; //이전 숫자
                    int nxt = N-1; //시작 인덱스
                    for(int j=N-1;j>=0;j--){
                        if(input[i][j]==0) continue;
                        else {
                            if (tmp == input[i][j]) {
                                after[i][nxt + 1] = input[i][j] * 2;
                                tmp = -1;
                                MAX = Math.max(MAX,after[i][nxt + 1]);
                            } else {
                                after[i][nxt] = input[i][j];
                                tmp = input[i][j];
                                nxt--;
                            }
                        }
                    }
                }
                break;
        }
        return after;
    }

    public static void main(String args[]) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        N = Integer.parseInt(br.readLine());
        map = new int[N][N];
        MAX = 0;

        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());
                MAX = Math.max(MAX,map[i][j]);
            }
        }
        dfs(map,0);
        System.out.println(MAX);
    }
}

아래방향, 오른방향을 구현하면서 범위설정을 잘못하여 시간을 많이 뺏겼다..

처음 코드를 작성할 때 더욱 꼼꼼히 생각을 하면서 작성을 해야 디버깅 시간을 낭비하지 않을 것 같다.