이중 반복문으로 inRange 즉, 영역을 벗어나는 경우 방향을 바꿔주는 방식으로 값을 구하면 되며, 음수가 없기에, 무조건 항 방향으로 끝까지 가는 경우를 계산하는 것이 최대값이라고 생각했다. (단, 네 모서리에 접근하는 경우 직사각형이 안되기 때문에 예외처리가 필요하다.) 끝까지 이동하지 않고 방향을 바꾸는 경우, 최대값이 될 수 있다. 즉, 각 노드 별 이동가능한 모든 경우의 수를 확인해야 최대값을 구할 수 있다.
각 노드 별로 직진 or 방향 전환 두 가지 경우만 있기 때문에 재귀로 풀었다.
예외처리를 잘 해줘야 한다.
import java.util.*;
public class Main {
static int n;
static int ans = 0;
static int[][] matrix;
static int startRow, startCol;
static int[] dx = {-1, -1, 1, 1};
static int[] dy = {1, -1, -1, 1};
public static void main(String[] args) {
init();
for(int i = 2; i < n; i++) {
for(int j = 1; j < n - 1; j++) {
startRow = i;
startCol = j;
solve(i, j, 0, 0);
}
}
System.out.println(ans);
}
public static void init() {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
matrix = new int[n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
matrix[i][j] = sc.nextInt();
}
}
}
public static void solve(int row, int col, int dir, int value) {
if(row == startRow && col == startCol && dir == 3) {
ans = Math.max(ans, value);
return;
}
if(dir == 3 && (row > startRow || col > startCol)) return;
int nx = row + dx[dir];
int ny = col + dy[dir];
if(inRange(nx, ny)) {
solve(nx, ny, dir, value + matrix[nx][ny]);
}
if(dir == 3 || row == startRow && col == startCol) return;
nx = row + dx[dir + 1];
ny = col + dy[dir + 1];
if(inRange(nx, ny)) {
solve(nx, ny, dir + 1, value + matrix[nx][ny]);
}
}
public static boolean inRange(int row, int col) {
if(0 <= row && row < n && 0 <= col && col < n) {
if((row == 0 || row == n || row == -n) && (col == 0 || col == n || col == -n)) return false;
return true;
}
return false;
}
}
오늘의 회고
오늘 계획한 일을 못했다. 내가 생각하는 원인으로 "비합리적인 시간 분배"였다고 생각한다. > 알고리즘 한 문제에 너무 많은 시간을 할애했다. 적정 시간을 정해놓고 풀어야겠다.