문제 : 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);
}
}
'백준온라인' 카테고리의 다른 글
[백준온라인] 13458번 시험 감독 (0) | 2019.12.04 |
---|---|
[백준온라인] 3190번 뱀 (0) | 2019.12.04 |
[백준온라인] 2884번 알람 시계 (0) | 2019.12.02 |
[백준온라인] 13460번 구슬 탈출 2 (0) | 2019.12.01 |
[백준온라인] 1008번 A/B (0) | 2019.12.01 |