

4방향의 정보를 포함하는 델타 배열(행, 열 각각)을 생성하여 이를 활용하였다.
탐색 방법은 단순하게 2중 for문을 사용했다.
처음에 문제를 꼼꼼히 안 읽어서 "0과 인접한 숫자" 에 대해서만 4방 탐색을 수행해야 하는데, 모든 숫자에 대해 4방 탐색을 수행했다. 문제를 꼼꼼히 보자.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class fourDirArray {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
int[] dr = {-1, 1, 0, 0};
int[] dc = {0 ,0 ,-1, 1};
// 테스트 케이스 t번 입력받기
for(int o = 1; o <= t; o++){
int sum = 0;
String[] fs = br.readLine().split(" ");
int n = Integer.parseInt(fs[0]);
int m = Integer.parseInt(fs[1]);
int[][] map = new int[n][m];
int[][] map_v = new int[n][m]; // 방문 처리를 위한 배열(map 에 하면 나머지 케이스에 적용 불가)
// 배열 입력
for(int r = 0; r < n; r++){
String[] s = br.readLine().split(" ");
for(int c = 0; c < m; c++){
map[r][c] = s[c].charAt(0) - '0';
}
}
// 4방 탐색
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
for(int d = 0; d < 4; d++){
int nr = i + dr[d];
int nc = j + dc[d];
if(map[i][j] == 0 && nr >= 0 && nr < n && nc >= 0 && nc < m && map_v[nr][nc] != -1){
sum += map[nr][nc];
map_v[nr][nc] = -1; // 방문처리, 재방문 못하도록
}
}
}
}
System.out.println("#" + o + " " + sum);
}
}
}