https://www.acmicpc.net/problem/12100
12100번: 2048 (Easy)
첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2
www.acmicpc.net
1. 상,하,좌,우 이동에 따른 map을 계속 저장하며 dfs를 수행한다.
2. 이동횟수 5번이 되면 return
3. 최종적으로 MAX 값을 출력한다.
move method는 이 방식으로 동작한다.
import java.util.*;
import java.io.*;
public class Main
{
static int N;
static int map[][];
static int MAX;
static void dfs(int[][] input, int cnt){
//5번 이동했으면 종료
if(cnt==5){
return;
}
for(int d=0;d<4;d++){
int[][] moved = move(input,d);
dfs(moved,cnt+1);
}
}
static int[][] move(int[][] input,int d){
int[][] after = new int[N][N];
switch (d){
case 0: //위
for(int i=0;i<N;i++){
int tmp = -1; //이전 숫자
int nxt = 0; //시작 인덱스
for(int j=0;j<N;j++){
if(input[j][i]==0) {
continue;
}
else {
if (tmp == input[j][i]) {
after[nxt - 1][i] = input[j][i] * 2;
tmp = -1;
MAX = Math.max(MAX,after[nxt - 1][i]);
} else {
after[nxt][i] = input[j][i];
tmp = input[j][i];
nxt++;
}
}
}
}
break;
case 1: //아래
for(int i=0;i<N;i++){
int tmp = -1; //이전 숫자
int nxt = N-1; //시작 인덱스
for(int j=N-1;j>=0;j--){
if(input[j][i]==0) continue;
else {
if (tmp == input[j][i]) {
after[nxt + 1][i] = input[j][i] * 2;
tmp = -1;
MAX = Math.max(MAX,after[nxt + 1][i]);
} else {
after[nxt][i] = input[j][i];
tmp = input[j][i];
nxt--;
}
}
}
}
break;
case 2: //왼
for(int i=0;i<N;i++){
int tmp = -1; //이전 숫자
int nxt = 0; //시작 인덱스
for(int j=0;j<N;j++){
if(input[i][j]==0) continue;
else {
if (tmp == input[i][j]) {
after[i][nxt - 1] = input[i][j] * 2;
tmp = -1;
MAX = Math.max(MAX,after[i][nxt - 1]);
} else {
after[i][nxt] = input[i][j];
tmp = input[i][j];
nxt++;
}
}
}
}
break;
case 3: //오
for(int i=0;i<N;i++){
int tmp = -1; //이전 숫자
int nxt = N-1; //시작 인덱스
for(int j=N-1;j>=0;j--){
if(input[i][j]==0) continue;
else {
if (tmp == input[i][j]) {
after[i][nxt + 1] = input[i][j] * 2;
tmp = -1;
MAX = Math.max(MAX,after[i][nxt + 1]);
} else {
after[i][nxt] = input[i][j];
tmp = input[i][j];
nxt--;
}
}
}
}
break;
}
return after;
}
public static void main(String args[]) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
map = new int[N][N];
MAX = 0;
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());
MAX = Math.max(MAX,map[i][j]);
}
}
dfs(map,0);
System.out.println(MAX);
}
}
아래방향, 오른방향을 구현하면서 범위설정을 잘못하여 시간을 많이 뺏겼다..
처음 코드를 작성할 때 더욱 꼼꼼히 생각을 하면서 작성을 해야 디버깅 시간을 낭비하지 않을 것 같다.
'알고리즘' 카테고리의 다른 글
[SWEA] SWEA5658 - 보물상자 비밀번호 (JAVA) (0) | 2023.04.03 |
---|---|
[PGS] 프로그래머스 - N개의 최소공배수 (JAVA) (0) | 2023.03.28 |
[SWEA] 1949. 등산로 조성 (JAVA) (0) | 2023.03.11 |
[PGS] 프로그래머스 - 입국심사 (JAVA) (0) | 2023.03.08 |
[PGS] 프로그래머스 - 다리를 지나는 트럭 (JAVA) (0) | 2023.03.08 |