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

 

12100번: 2048 (Easy)

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

www.acmicpc.net

문제 요약 : 상하좌우를 최대 5번 이용해 만들 수 있는 가장 큰 수

입력 출력

1 ≤ N(크기) ≤ 20

[N][N] = 2^n (n>0)

상하좌우 5회 후 가장 큰 수

 

JAVA

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
16338213 cbkpar 12100 맞았습니다!! 26172KB 280ms Java 2878B
import java.io.*;

public class Main {

	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n,i,j,k,t,p,q;
		int m = 0;
		
		String str = "";
		
		n = Integer.parseInt(br.readLine());
		int[][] board = new int[n][n]; //입력 판
		int[][] tb = new int[n][n]; //복사할 판
		for(i=0;i<n;i++) {
			str = br.readLine();
			String[] arr = str.split(" ");
			for(j=0;j<n;j++) {
				board[i][j]=Integer.parseInt(arr[j]);
			}
		}
		for(p=0;p<1024;p++) { // 상0 하1 좌2 우3 => 5번 1024가지 경우의수
			q=p;
			for(i=0;i<n;i++) {
				System.arraycopy(board[i], 0, tb[i], 0, n); //배열복사
			}
			for(k=0;k<5;k++) {
				if(q%4==0) { //상
                //블럭을 이동후 합치고 다시 이동시키는 과정
					for(i=0;i<n;i++) { //이동
						t=0;
						for(j=0;j<n;j++) { //빈칸이아니면 순서대로 이동
							if(tb[j][i]!=0)	tb[t++][i]=tb[j][i];
						}
						for(j=t;j<n;j++) { //나머지 모두 빈칸으로 초기화
							tb[j][i]=0;
						}
					}
					for(i=0;i<n;i++) {//결합
						for(j=0;j<n-1;j++) {
							if(tb[j][i]==tb[j+1][i]) {
								tb[j][i]*=2;
								tb[j+1][i]=0;
							}
						}
					}
					for(i=0;i<n;i++) {//이동
						t=0;
						for(j=0;j<n;j++) {
							if(tb[j][i]!=0)	tb[t++][i]=tb[j][i];
						}
						for(j=t;j<n;j++) {
							tb[j][i]=0;
						}
					}
				}else if(q%4==1) { //하
					for(i=0;i<n;i++) {
						t=n-1;
						for(j=0;j<n;j++) {
							if(tb[n-1-j][i]!=0)	tb[t--][i]=tb[n-1-j][i];
						}
						for(j=0;j<=t;j++) {
							tb[j][i]=0;
						}
					}
					for(i=0;i<n;i++) {
						for(j=0;j<n-1;j++) {
							if(tb[n-1-j][i]==tb[n-2-j][i]) {
								tb[n-1-j][i]*=2;
								tb[n-2-j][i]=0;
							}
						}
					}
					for(i=0;i<n;i++) {
						t=n-1;
						for(j=0;j<n;j++) {
							if(tb[n-1-j][i]!=0)	tb[t--][i]=tb[n-1-j][i];
						}
						for(j=0;j<=t;j++) {
							tb[j][i]=0;
						}
					}
				}else if(q%4==2) { //좌
					for(i=0;i<n;i++) {
						t=0;
						for(j=0;j<n;j++) {
							if(tb[i][j]!=0)	tb[i][t++]=tb[i][j];
						}
						for(j=t;j<n;j++) {
							tb[i][j]=0;
						}
					}
					for(i=0;i<n;i++) {
						for(j=0;j<n-1;j++) {
							if(tb[i][j]==tb[i][j+1]) {
								tb[i][j]*=2;
								tb[i][j+1]=0;
							}
						}
					}
					for(i=0;i<n;i++) {
						t=0;
						for(j=0;j<n;j++) {
							if(tb[i][j]!=0)	tb[i][t++]=tb[i][j];
						}
						for(j=t;j<n;j++) {
							tb[i][j]=0;
						}
					}
				}else { //우
					for(i=0;i<n;i++) {
						t=n-1;
						for(j=0;j<n;j++) {
							if(tb[i][n-1-j]!=0)	tb[i][t--]=tb[i][n-1-j];
						}
						for(j=0;j<=t;j++) {
							tb[i][j]=0;
						}
					}
					for(i=0;i<n;i++) {
						for(j=0;j<n-1;j++) {
							if(tb[i][n-1-j]==tb[i][n-2-j]) {
								tb[i][n-1-j]*=2;
								tb[i][n-2-j]=0;
							}
						}
					}
					for(i=0;i<n;i++) {
						t=n-1;
						for(j=0;j<n;j++) {
							if(tb[i][n-1-j]!=0)	tb[i][t--]=tb[i][n-1-j];
						}
						for(j=0;j<=t;j++) {
							tb[i][j]=0;
						}
					}
				}
				q/=4;
			}
			for(i=0;i<n;i++) {
				for(j=0;j<n;j++) {
					m=Math.max(m, tb[i][j]);
				}
			}
		}
		System.out.println(m);
	}
}

 

+ Recent posts