public class Solution {
int[] dx = {0, 0, -1, 1}; // 상, 하, 좌, 우
int[] dy = {-1, 1, 0, 0};
public int bfs(int y, int x, int sum, char[][] map, boolean[][] visited) {
Queue<int[]> q = new LinkedList<>();
q.add(new int[]{y, x});
visited[y][x] = true;
while(true) {
if(q.isEmpty()) {
return sum;
}
int[] next = q.poll();
int curY = next[0];
int curX = next[1];
sum += map[curY][curX] - 48;
for(int i = 0; i < 4; i++) {
int ny = curY + dy[i];
int nx = curX + dx[i];
if(ny < 0 || ny >= visited.length) {
continue;
}
if(nx < 0 || nx >= visited[0].length) {
continue;
}
if(map[ny][nx] == 'X') {
continue;
}
if(visited[ny][nx] == true) {
continue;
}
q.add(new int[]{ny, nx});
visited[ny][nx] = true;
}
}
}
public int[] solution(String[] maps) {
// 지도를 2차원 배열로 옮기기
char[][] map = new char[maps.length][maps[0].length()];
for(int i = 0; i < maps.length; i++) {
String current = maps[i];
for(int j = 0; j < maps[0].length(); j++) {
map[i][j] = current.charAt(j);
}
}
boolean[][] visited = new boolean[maps.length][maps[0].length()];
List<Integer> answer = new ArrayList<>();
// 무인도 찾기
for(int y = 0; y < maps.length; y++) {
for(int x = 0; x < maps[0].length(); x++) {
if(visited[y][x] == true) {
continue;
}
visited[y][x] = true;
if(map[y][x] == 'X') {
continue;
}
// 무인도 찾았으면 연결된 땅의 숫자 더하기
int sum = bfs(y, x, 0, map, visited);
answer.add(sum);
}
}
// 무인도가 없으면 배열에 -1 담아서 return
if(answer.size() == 0) {
return new int[]{-1};
}
Collections.sort(answer);
return answer.stream()
.mapToInt(i -> i)
.toArray();
}
}