지도를 나타내는 문자열 배열 maps가 주어질 때, 연결되는 숫자들의 합을 배열에 담아 return하는 solution함수를 작성하는 문제이다.
여기서 지도를 나타내는 조건은
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
class Solution {
String[] map;
boolean[][] visited;
public int[] solution(String[] maps) {
int[] answer;
visited = new boolean[maps.length][maps[0].length()];
map = maps;
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < visited.length; i++) {
for (int j = 0; j < visited[i].length; j++) {
if (!visited[i][j]) {
char target = maps[i].charAt(j);
if (target == 'X') {
visited[i][j] = true;
} else {
int sum = bfs(i, j);
list.add(sum);
}
}
}
}
if (list.size() == 0) {
answer = new int[1];
answer[0] = -1;
} else {
answer = new int[list.size()];
for (int i = 0; i < answer.length; i++) {
answer[i] = list.get(i);
}
Arrays.sort(answer);
}
return answer;
}
private int bfs(int i, int j) {
int sum = 0;
LinkedList<String> queue = new LinkedList<>();
int tn = map[i].charAt(j)-'0';
sum = tn;
queue.add(i + "," + j);
visited[i][j] = true;
int[][] arnd = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; // 주변 노드
while(!queue.isEmpty()) { // queue가 empty가 될 때까지
String qp = queue.pop();
String[] qn = qp.split(",");
int x = Integer.parseInt(qn[0]);
int y = Integer.parseInt(qn[1]);
for (int k = 0; k < arnd.length; k++) {
int tx = x + arnd[k][0];
int ty = y + arnd[k][1];
if (tx >= 0 && tx < map.length
&& ty >= 0 && ty < map[0].length()
&& !visited[tx][ty]) { // 방문하지 않은 곳이라면
tn = (map[tx].charAt(ty));
if (tn != 'X') {
sum += (tn - '0');
queue.add(tx + "," + ty);
}
visited[tx][ty] = true;
}
}
}
return sum;
}
}