📌 고정 게시글

📢 공지합니다

이 게시글은 메인 페이지에 항상 고정되어 표시됩니다.

최코딩의 개발

[백준 12100번] 2048(Easy) 본문

코딩테스트/백준

[백준 12100번] 2048(Easy)

seung_ho_choi.s 2025. 5. 16. 23:53
728x90

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

 

package implement;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Impl12100 {
    static int answer = 0;
    static int N;

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

        N = Integer.parseInt(br.readLine());
        int[][] board = new int[N][N];

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                board[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        solution(0, board);
        System.out.println(answer);
    }

    private static void solution(int depth, int[][] board) {
        if (depth == 5) {
            answer = Math.max(answer, getMax(board));
            return;
        }


        for (int dir = 0; dir < 4; dir++) {
            int[][] move = move(dir, board);
            solution(depth+1, move);
        }
    }

    private static int getMax(int[][] board) {
        int max = 0;
        for (int[] row : board) {
            for (int val : row) {
                max = Math.max(max, val);
            }
        }
        return max;
    }

    private static int[][] move(int dir, int[][] board) {
        int [][] newBoard = new int[N][N];

        for(int i=0; i<N; i++){
            int []temp =new int[N];
            int idx = 0;
            boolean merge=false;
            for(int j=0; j<N; j++){
                int x,y;
                if(dir ==0){
                    x=j;
                    y=i;
                }else if(dir ==1){
                    x=i;
                    y=j;
                }else if(dir ==2){
                    x= N-1-j;
                    y= i;
                }else{
                    x=i;
                    y= N-1-j;
                }
                int value = board[x][y];
                if(value ==0){
                    continue;
                }

                if(idx !=0 && temp[idx-1] == value &&!merge){
                    temp[idx-1] *=2;
                    merge=true;
                }else{
                    temp[idx] = value;
                    idx++;
                    merge=false;
                }
            }

            for(int j=0; j<N; j++){
                if(dir==0){
                    newBoard[j][i] = temp[j];
                }else if(dir ==1){
                    newBoard[i][j] = temp[j];
                }else if(dir ==2){
                    newBoard[N-1-j][i] =temp[j];
                }else{
                    newBoard[i][N-1-j] =temp[j];
                }
            }

        }

        return newBoard;

    }
}

 

 

이 문제는 정말 감탄이 나오는 문제다.

핵심은 얕은 복사를 이용해 이전 배열을 참조한 채 재귀를 호출하면 원본 배열이 손상되지 않는다는 점이다. 또한 temp와 idx를 활용하면 블록을 한 번에 밀고 병합하는 과정을 효율적으로 처리할 수 있다.

728x90

'코딩테스트 > 백준' 카테고리의 다른 글

[백준 14890번] 경사로  (0) 2025.05.19
[백준 14500번] 테트로미노  (0) 2025.05.18
[백준 14719번] 빗물  (0) 2025.05.15
[백준 11066번] 파일 합치기  (0) 2025.05.12
[백준 3190번] 뱀  (0) 2025.04.01