굉장히 재밌는 문제다. 간단하면서 아이디어를 가지고 푸는 문제는 퀴즈를 푸는 것 처럼 재밌다. 구현 때문에 힘든일도 없고...
이 문제는 구조적으로 나눠서 단순화 시키는 것이 핵심이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[][] map;
static int[][] dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
static int N, M, ans;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
ans = 0;
map = new int[N][M];
for(int r = 0 ; r < N ; ++r) {
st = new StringTokenizer(br.readLine());
for(int c = 0 ; c < M ; ++c) {
map[r][c] = Integer.parseInt(st.nextToken());
}
}
// 위, 아래
ans += N * M * 2;
// 옆
for(int r = 0 ; r < N ; ++r) {
for(int c = 0 ; c < M ; ++c) {
int cnt = map[r][c] * 4;
for(int d = 0 ; d < 4 ; ++d) {
int nr = r + dir[d][0];
int nc = c + dir[d][1];
if(nr < 0 || nr >= N || nc < 0 || nc >= M) continue;
if(map[nr][nc] > map[r][c]) {
cnt -= map[r][c];
} else {
cnt -= map[nr][nc];
}
}
ans += cnt;
}
}
System.out.println(ans);
}
}