[프로그래머스] 무인도 여행 (Java)
https://school.programmers.co.kr/learn/courses/30/lessons/154540
입력 : 지도를 나타내는 문자열 배열 maps[] (3 ≤ maps.length ≤ 100)
출력 : 각 섬에서 최대 머무를 수 있는 정수 배열 result[]. 단, 지낼 수 있는 무인도가 없다면 -1 리턴
O(n)
dfs
구현
import java.util.*;
class Solution {
private int n, m; //맵의 행과 열의 크기
private boolean[][] visited;
private String[] maps; //입력으로 받은 맵을 저장
private int[] dx = {0, 0, -1, 1};
private int[] dy = {-1, 1, 0, 0};
public int[] solution(String[] maps) {
this.n = maps.length;
this.m = maps[0].length();
this.visited = new boolean[n][m];
this.maps = maps;
List<Integer> islands = new ArrayList<>(); //섬의 크기를 저장할 리스트
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (!visited[i][j] && maps[i].charAt(j) != 'X') {
islands.add(dfs(i, j));
}
}
}
if (islands.isEmpty()) {
return new int[]{-1};
}
Collections.sort(islands);
return islands.stream().mapToInt(i -> i).toArray();
}
private int dfs(int x, int y) {
visited[x][y] = true;
int sum = maps[x].charAt(y) - '0'; //현재 위치에 있는 문자를 숫자로 변환
for (int dir = 0; dir < 4; dir++) {
int nx = x + dx[dir];
int ny = y + dy[dir];
if (nx >= 0 && ny >= 0 && nx < n && ny < m && !visited[nx][ny] && maps[nx].charAt(ny) != 'X') {
sum += dfs(nx, ny);
}
}
return sum;
}
}