https://www.acmicpc.net/problem/12100
큐를 이용해서 문제를 풀었다. 상하좌우 방향으로 각각 미는 것을 생각해서 계산을 해줬는데, 맵을 90도씩 돌려서 계산하면 더 코드가 간단해질 것이다. 맵을 복사해두는 copy배열을 전역으로 둬서 한번 틀렸다.ㅠㅠ
재귀일 때는 맵카피를 주의하도록 하자!
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int N,ans=0;
static int[][] map;
//static int[][] copy;
static int[] dx= {0,-1,0,1};
static int[] dy= {-1,0,1,0};
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N=Integer.parseInt(br.readLine());
StringTokenizer st;
map=new int[N][N];
//copy=new int[N][N];
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine()," ");
for(int j=0; j<N; j++) {
map[i][j]=Integer.parseInt(st.nextToken());
}
}
dfs(0);
System.out.println(ans);
}
private static void dfs(int cnt) {
if(cnt==5) {
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
if(map[i][j]>ans) ans= map[i][j];
}
}
return;
}
for(int d=0; d<4; d++) {
int[][] copy=new int[N][N];
copyMap(copy,map);
move(d);
dfs(cnt+1);
copyMap(map,copy);
}
}
private static void print() {
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
System.out.println();
}
private static void move(int d) {
if(d==0) {//좌로 밀기
for(int i=0; i<N; i++) {
Deque<Integer> dq=new ArrayDeque<Integer>();
boolean f=false;
int tmp=-1;
for(int j=0; j<N; j++) {
if(map[i][j]!=0) {//숫자가 있으면
if(tmp!=map[i][j]) {//이전 숫자랑 같지않으면 그냥 넣기
dq.offerLast(map[i][j]);
tmp=map[i][j];
f=false;
}else if(tmp==map[i][j]) {//이전 숫자랑 같으면
if(f==false) {//이전에 계산 작업안했으면
int val = dq.pollLast()*2;
dq.offerLast(val);
f=true;
}else {//이전에 계산 작업헀으면 그냥 넣기
dq.offerLast(map[i][j]);
tmp=map[i][j];
f=false;
}
}
map[i][j]=0;
}
}
int j=0;
while(!dq.isEmpty()) {
map[i][j]=dq.pollFirst();
j++;
}
}
}
if(d==1) {//위로 밀기
for(int j=0; j<N; j++) {
Deque<Integer> dq=new ArrayDeque<Integer>();
boolean f=false;
int tmp=-1;
for(int i=0; i<N; i++) {
if(map[i][j]!=0) {//숫자가 있으면
if(tmp!=map[i][j]) {//이전 숫자랑 같지않으면 그냥 넣기
dq.offerLast(map[i][j]);
tmp=map[i][j];
f=false;
}else if(tmp==map[i][j]) {//이전 숫자랑 같으면
if(f==false) {//이전에 계산 작업안했으면
int val = dq.pollLast()*2;
dq.offerLast(val);
f=true;
}else {//이전에 계산 작업헀으면 그냥 넣기
dq.offerLast(map[i][j]);
tmp=map[i][j];
f=false;
}
}
map[i][j]=0;
}
}
int i=0;
while(!dq.isEmpty()) {
map[i][j]=dq.pollFirst();
i++;
}
}
}
if(d==2) {//오른쪽으로 밀기
for(int i=0; i<N; i++) {
Deque<Integer> dq=new ArrayDeque<Integer>();
boolean f=false;
int tmp=-1;
for(int j=N-1; j>=0; j--) {
if(map[i][j]!=0) {//숫자가 있으면
if(tmp!=map[i][j]) {//이전 숫자랑 같지않으면 그냥 넣기
dq.offerLast(map[i][j]);
tmp=map[i][j];
f=false;
}else if(tmp==map[i][j]) {//이전 숫자랑 같으면
if(f==false) {//이전에 계산 작업안했으면
int val = dq.pollLast()*2;
dq.offerLast(val);
f=true;
}else {//이전에 계산 작업헀으면 그냥 넣기
dq.offerLast(map[i][j]);
tmp=map[i][j];
f=false;
}
}
map[i][j]=0;
}
}
int j=N-1;
while(!dq.isEmpty()) {
map[i][j]=dq.pollFirst();
j--;
}
}
}
if(d==3) {//아래로 밀기
for(int j=0; j<N; j++) {
Deque<Integer> dq=new ArrayDeque<Integer>();
boolean f=false;
int tmp=-1;
for(int i=N-1; i>=0; i--) {
if(map[i][j]!=0) {//숫자가 있으면
if(tmp!=map[i][j]) {//이전 숫자랑 같지않으면 그냥 넣기
dq.offerLast(map[i][j]);
tmp=map[i][j];
f=false;
}else if(tmp==map[i][j]) {//이전 숫자랑 같으면
if(f==false) {//이전에 계산 작업안했으면
int val = dq.pollLast()*2;
dq.offerLast(val);
f=true;
}else {//이전에 계산 작업헀으면 그냥 넣기
dq.offerLast(map[i][j]);
tmp=map[i][j];
f=false;
}
}
map[i][j]=0;
}
}
int i=N-1;
while(!dq.isEmpty()) {
map[i][j]=dq.pollFirst();
i--;
}
}
}
}
private static void copyMap(int[][] arr1, int[][] arr2) {
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
arr1[i][j]=arr2[i][j];
}
}
}
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 1707] 이분 그래프(JAVA) (0) | 2020.03.11 |
---|---|
[백준 14499] 주사위 굴리기(JAVA/C++) (0) | 2020.03.10 |
[백준 16987] 계란으로 계란치기(JAVA/C++) (0) | 2020.03.07 |
[백준 14502] 연구소(JAVA/C++) (0) | 2020.03.06 |
[백준 2563] 색종이(JAVA) (0) | 2020.03.05 |
댓글