곽로그

[백준 12100, Java] 2046(easy) 본문

알고리즘/백준

[백준 12100, Java] 2046(easy)

일도이동 2020. 10. 14. 17:30
반응형

쉽다는 건 거짓말일거야.

 

실수한 부분

1."한 번의 이동에서 이미 합쳐진 블록은 또 다른 블록과 다시 합쳐질 수 없다."

위의 조건에서 이동하는 방향에 있는 셀이 합쳐졌던 블록인지 만 검사했다. 다시말해 이동하는 셀이 이미 합쳐진 블록인지를 검사하지 않았다. 

- 0 32 32 64 0 의 경우 이동하는 셀이 합쳐진 블록인지를 검사하지 않으면 0 0 0 0 128이 된다

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
	public static int N;
	public static int[][] map;
	public static int[][] tempMap;
	public static int BLANK = 0;

	public static int[] d = new int[5];
	public static int[] dx = { -1, 0, 1, 0 };
	public static int[] dy = { 0, 1, 0, -1 };
	
	public static int maxResult =0;

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

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

		
		for(int r= 0 ;r<N ; r++) { 
			st = new StringTokenizer(br.readLine()," ");
			for(int c=0 ;c<N ; c++) { 
				map[r][c] = Integer.parseInt(st.nextToken()); 
			} 
		}
		
		
//			tempMap = new int[N][N];
//			copyMap(map,tempMap);
//			moveCell(1,tempMap);
//			System.out.println("--------------");
//			printMap(tempMap);
//			
//			moveCell(1,tempMap);
//			System.out.println("--------------");
//			printMap(tempMap);
			
			

		
		
		selectDirection(0);
		bw.write(String.valueOf(maxResult));
		bw.flush();
	}

	public static void selectDirection(int index) {
		// 0~4까지 5개 선택
		if (index >= d.length) {
			maxResult = Math.max(rollingMap(d),maxResult);
		} else {
			for (int direction = 0; direction < 4; direction++) {
				d[index] = direction;
				selectDirection(index + 1);
			}
		}
	}
	
	public static int rollingMap(int[] directionArray) {
		int result = 0;
		
		tempMap = new int[N][N];
		copyMap(map,tempMap);
		
		for(int c = 0; c<directionArray.length; c++) {
			int direction = directionArray[c];
			moveCell(direction,tempMap);
		}
		
		for(int r=0;r<N ;r++) {
			for(int c=0;c<N; c++) {
				if(result<tempMap[r][c]) {
					result = tempMap[r][c];
				}
			}
		}
		return result;
	}
	public static void moveCell(int direction, int[][] mapToMove) {
		boolean[][] changed = new boolean[N][N];
		//위로 
		if(direction==0) {
			for(int c=0; c<N; c++) {
				for(int r=1;r<N;r++) {
					int mr = r;
					int mc = c;
					boolean isChanged = false;
					if(mapToMove[mr][mc]!=0) {
						while(mr>0) {
							if(mapToMove[mr-1][mc]==0) {
								mapToMove[mr-1][mc] = mapToMove[mr][mc];
								mapToMove[mr][mc] =0;
								mr--;
							}
							else if(mapToMove[mr-1][mc]==mapToMove[mr][mc]){
								if(!changed[mr-1][mc] && !isChanged) {
									mapToMove[mr-1][mc] =mapToMove[mr-1][mc]*2;
									mapToMove[mr][mc] =0;
									changed[mr-1][mc]=true;
									isChanged = true;
									mr--;
								}
								else {
									break;
								}
							}
							else {
								break;
							}
						}
					}
				}
			}
		}
		//오른쪽으로 
		else if(direction==1) {
			for(int r=0; r<N; r++) {
				for(int c=N-2;c>=0;c--) {
					int mr = r;
					int mc = c;
					boolean isChanged = false;
					if(mapToMove[mr][mc]!=0) {
						while(mc<N-1) {
							if(mapToMove[mr][mc+1]==0) {
								mapToMove[mr][mc+1] = mapToMove[mr][mc];
								mapToMove[mr][mc] =0;
								mc++;
							}
							else if(mapToMove[mr][mc+1]==mapToMove[mr][mc]){
								if(!changed[mr][mc+1] && !isChanged) {
									mapToMove[mr][mc+1] =mapToMove[mr][mc+1]*2;
									mapToMove[mr][mc] =0;
									changed[mr][mc+1]=true;
									isChanged =true;
									mc++;
								}
								else {
									break;
								}
							}
							else {
								break;
							}
						}
					}
				}
			}
		
		}
		//왼쪽으로 
		else if(direction==3) {
			for(int r=0; r<N; r++) {
				for(int c=1;c<N;c++) {
					int mr = r;
					int mc = c;
					boolean isChanged = false;
					if(mapToMove[mr][mc]!=0) {
						while(mc>0) {
							if(mapToMove[mr][mc-1]==0) {
								mapToMove[mr][mc-1] = mapToMove[mr][mc];
								mapToMove[mr][mc] =0;
								mc--;
							}
							else if(mapToMove[mr][mc-1]==mapToMove[mr][mc]){
								if(!changed[mr][mc-1] && !isChanged) {
									mapToMove[mr][mc-1] =mapToMove[mr][mc-1]*2;
									mapToMove[mr][mc] =0;
									changed[mr][mc-1]=true;
									isChanged= true;
									mc--;
								}
								else {
									break;
								}
							}
							else {
								break;
							}
						}
					}
				}
			}
		}
		//아래쪽으로 
		else if(direction==2) {
			for(int c=0; c<N; c++) {
				for(int r=N-1;r>=0;r--) {
					int mr = r;
					int mc = c;
					boolean isChanged = false;
					if(mapToMove[mr][mc]!=0) {
						while(mr<N-1) {
							if(mapToMove[mr+1][mc]==0) {
								mapToMove[mr+1][mc] = mapToMove[mr][mc];
								mapToMove[mr][mc] =0;
								mr++;
							}
							else if(mapToMove[mr+1][mc]==mapToMove[mr][mc]){
								if(!changed[mr+1][mc] && !isChanged) {
									mapToMove[mr+1][mc] =mapToMove[mr+1][mc]*2;
									mapToMove[mr][mc] =0;
									changed[mr+1][mc]=true;
									isChanged =true;
									mr++;
								}
								else {
									break;
								}
							}
							else {
								break;
							}
						}
					}
				}
			}
		}
	}
	public static void copyMap(int[][] source, int[][] dest) {
		for(int r=0;r<N; r++) {
			for(int c=0;c<N;c++) {
				dest[r][c] = source[r][c];
			}
		}
	}
	
	public static void printMap(int[][] maptoPrint) {
		for(int r=0 ;r<N; r++) {
			for(int c=0;c<N; c++) {
				System.out.printf("%4d",maptoPrint[r][c]);
			}
			System.out.println();
		}
	}
}
반응형
Comments