Lewis's Tech Keep

[백준] 2048 (easy) 본문

JAVA/알고리즘

[백준] 2048 (easy)

Lewis Seo 2021. 3. 18. 02:04

참고 : www.acmicpc.net/problem/12100

 

12100번: 2048 (Easy)

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

www.acmicpc.net

- 시뮬레이션

- 구현 중점

 - 1. 한쪽으로 이동 시킨다 (moveBlock)

 - 2. 회전 시킨다 (좌 하 우 상 )

 - 3. 5번 진행 시킨다.

 

더보기

코드 예제

import java.util.*;

public class Solution {
    static int n;
    static int[][] board1 = new int[22][22];
    static int[][] board2 = new int[22][22];

    private static void moveBlock(int dir) {
        while(dir--> 0) rotate();
        for (int i = 0; i < n; i++) {
            int[] NBlock = new int[22];
            int idx = 0;
            for (int j = 0; j < n; j++) {
                if(board2[i][j] == 0) continue;
                if(NBlock[idx] == 0)
                    NBlock[idx] = board2[i][j];
                else if(NBlock[idx] == board2[i][j])
                    NBlock[idx++] *= 2;
                else
                    NBlock[++idx] = board2[i][j];
            }
            for (int j = 0; j < n; j++) {
                board2[i][j] = NBlock[j];
            }
        }

    }

    private static void rotate() {
        int[][] tmp = new int[22][22];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                tmp[i][j] = board2[i][j];
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                board2[i][j] = tmp[n-1-j][i];
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                board1[i][j] = sc.nextInt();
            }
        }
        int mx = 0;
        for (int tmp = 0; tmp < (1<<(2*5)); tmp++) {
            for (int j = 0; j < n; j++) {
                for (int k = 0; k < n; k++) {
                    board2[j][k] = board1[j][k];
                }
            }
            int brute = tmp;
            for (int i = 0; i < 5; i++) {
                int dir = brute % 4;
                brute /= 4;
                moveBlock(dir);
            }
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    mx = Math.max(mx, board2[i][j]);
                }
            }
        }

        System.out.println(mx);

    }
}

'JAVA > 알고리즘' 카테고리의 다른 글

[백준] 타일 채우기  (0) 2021.03.27
[백준] 2xn 타일링 2  (0) 2021.03.27
[백준] 2048(easy) - 실패  (0) 2021.03.16
[백준] 스티커 붙이기  (0) 2021.03.16
[백준] 감시  (0) 2021.03.13
Comments