Algorithm/Programmers
154540. 무인도 여행
사랑우주인
2025. 3. 13. 20:55
문제
https://school.programmers.co.kr/learn/courses/30/lessons/154540
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr

제한사항

풀이
import java.util.*;
class Solution {
public int[] solution(String[] maps) {
int[] answer = {};
List<Integer> result = new ArrayList<>();
int n = maps.length;
int m = maps[0].length();
int[][] mapArr =new int [n][m];
boolean[][] visited = new boolean[n][m];
for(int i = 0 ; i< n;i++)
for(int j = 0 ; j<m ; j++) {
if(maps[i].charAt(j) != 'X') {
mapArr[i][j] = maps[i].charAt(j) - '0';
} else {
mapArr[i][j] = 0;
}
// System.out.println(mapArr[i][j]);
}
for(int i = 0 ; i< n;i++)
for(int j = 0 ; j<m ; j++) {
if(visited[i][j] || mapArr[i][j] == 0) continue;
int days = bfs(i, j, visited, mapArr);
result.add(days);
// String arr[] = arrList.toArray(new String[arrListSize]);
}
if(result.isEmpty()) return new int[]{-1};
answer = result.stream().mapToInt(i->i).toArray();
Arrays.sort(answer);
return answer;
}
int bfs(int r, int c, boolean[][] visited, int[][] mapArr) {
Queue<int[]> q = new LinkedList<>();
int n = mapArr.length;
int m = mapArr[0].length;
int[][] dir = {{-1,0}, {1, 0}, {0, -1}, {0, 1}};
int days = mapArr[r][c];
q.offer(new int[]{r, c});
visited[r][c] = true;
while(!q.isEmpty()) {
int[] cur = q.poll();
for(int i = 0 ; i < 4 ; i++) {
int nr = cur[0] + dir[i][0];
int nc = cur[1] + dir[i][1];
if(nr>=0 && nr < n && nc>=0 && nc<m && !visited[nr][nc] && mapArr[nr][nc]!=0) {
q.offer(new int[]{nr, nc});
visited[nr][nc] = true;
// System.out.println("mapArr[nr][nc]: " + mapArr[nr][nc]);
days+= mapArr[nr][nc];
}
}
}
// System.out.println("days: " + days);
return days;
}
}
회고
섬을 찾고 섬에 머물 수 있는 기한을 찾는 문제였다. 기한은 섬을 구성하는 좌표의 값을 합한 값이다. BFS를 이용해 섬을 탐색하는 작업을 하였다. 비교적 쉬운 문제였지만, 각 좌표의 방문 또는 '섬'을 확인할 때, 섬일 경우 첫 방문 좌표를 방문 체크하지 않아서 살짝 헤맸다.