곽로그
[백준 12100, Java] 2046(easy) 본문
반응형
쉽다는 건 거짓말일거야.
실수한 부분
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();
}
}
}
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 15686, Java] 치킨배달 (0) | 2020.10.15 |
---|---|
[백준 14499, Java] 주사위 굴리기 (0) | 2020.10.15 |
[백준 16236,Java] 아기상어 (0) | 2020.10.11 |
[백준14891, Java] 톱니바퀴 (0) | 2020.10.07 |
[백준 16928, Java] 뱀과 사다리게임 (0) | 2020.10.07 |
Comments