1. ๋ฌธ์ ๋ถ์
2์ฐจ์ ๋ฐฐ์ด์์ ๋ฉด ๋ ๋ฉด์ผ๋ก ๋ถ๋ ์์๋ผ๋ฆฌ ์ด 4๊ฐ๋ฅผ ์ด์์ ๋, ์์๊ฐ์ ํฉ์ด ์ต๋๊ฐ์ด ๋๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํ์ฌ๋ผ.
2. ํธ๋ ์๋ฆฌ
ํ ํธ๋ก๋ฏธ๋ ธ๋ก ๋์ฌ ์ ์๋ ๊ฐ๋ค์ด ๋ฏธ๋ฆฌ ๋์ ์๋ค.
์ผ์ชฝ ์๋จ๋ถํฐ 1๋ฒ์ด๋ผ๊ณ ํ์. ๊ทธ๋ฆฌ๊ณ ์ผ์ชฝ -> ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฒํธ๋ฅผ ๋ถ์ด๊ฒ ๋ค.
1๋ฒ๋ถํฐ 4๋ฒ์ ํด๋นํ๋ ๋ธ๋ญ์ DFS๋ก ๊ฐ์ ๊ตฌํ ์ ์๋ค.
์๋ฅผ
๋ค์ด๋ณด๋ฉด,
๋ค์๊ณผ ๊ฐ๋ค. ํ์ง๋ง 5๋ฒ์ ๊ฒฝ์ฐ ๋จ์ dfs๋ก ์ ํ๋ฆฐ๋ค ์๋ํ๋ฉด ๋๋ฒ์งธ depth ๋ถํฐ ๊ฐ ์ ์๋ ๊ธธ์ด 2 ๊ฐ๋๋ก ๊ฐ๋ผ์ง๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ DFS๋ก๋ ํ์ง ๋ชปํ๊ณ , ์ค์์์ ์์ํ์ฌ 4๋ฐฉ ํ์ ์ค 3๋ฐฉ์ ๊ณ ๋ฅด๋ ์กฐํฉ์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์๋ค.
3. ์ฝ๋ ๋ถ์
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/*
* ํ
ํธ๋ก๋ฏธ๋
ธ
* 1 ~ 4๋ฒ ํจํด, dfs๋ก ํ๊ธฐ -> ๋ชจ๋ ๊ฒฝ์ฐ๊ฐ dfs๋ก ๋์จ๋ค.
* 5๋ฒ ํจํด์ 4๊ฐ ์ค 3๊ฐ์ ์ ์ ์กฐํฉ์ผ๋ก ๊ตฌํด์ ํ๊ธฐ
* */
public class Main {
static int N, M;
static int [] idx = {-1,0,1,0};
static int [] idy = {0,1,0,-1};
static int [][] arr;
static boolean [][] isVisited;
static int max = 0;
public static void main(String[] args) throws IOException {
// 1. ๊ฐ ์
๋ ฅ
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
arr = new int [N][M];
isVisited = new boolean[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
// 2. ๊ณ์ฐ
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
isVisited[i][j] = true;
// 1 ~ 4 ๋ฒ ํจํด ๊ณ์ฐ
dfs(i,j,0,arr[i][j]);
Combination(i,j,0,0,arr[i][j]);
// 5๋ฒ ํจํด ๊ณ์ฐ
isVisited[i][j] = false;
}
}
System.out.println(max);
}
public static void dfs (int x, int y, int depth, int sum){
// (1) ๊ธฐ์ ์กฐ๊ฑด
if(depth == 3){
max = Math.max(max, sum);
return;
}
// (2) ๊ณ์ฐ ํ๋ ๊ณณ
for (int i = 0; i < 4; i++) {
int nx = x + idx[i];
int ny = y + idy[i];
// ์ ํจ์ฑ ๊ฒ์ฆ -> dfs๋ก ๋์๊ฐ๋ ค๋ ์ง์ ์ด 2์ฐจ์ ๋ฐฐ์ด์ ์ํ๋ ์ง์ ์ด๋ฉด ์ ํจํจ์ผ๋ก, ๋ค์ DFS๋ก ๋์๊ฐ ์๊ฒฉ์ด ์๋ค.
if (nx >= 0 && ny >= 0 && nx < N && ny < M){
if(!isVisited[nx][ny]){
isVisited[nx][ny] = true;
dfs(nx,ny,depth+1, sum+arr[nx][ny]);
isVisited[nx][ny] = false;
}
}
}
}
// 5๋ฒ ํจํด ์ฉ ์กฐํฉ
public static void Combination (int x, int y, int depth, int start, int sum) {
// (1) ๊ธฐ์ ์กฐ๊ฑด
if(depth == 3){
max = Math.max(max, sum);
return;
}
// (2) ๊ณ์ฐ
for (int i = start; i < 4; i++) {
int nx = x + idx[i];
int ny = y + idy[i];
if( nx >= 0 && ny >= 0 && nx < N && ny < M) {
Combination(x,y,depth+1, i+1, sum + arr[nx][ny]);
}
}
}
}