반응형
무인도 여행 문제
https://school.programmers.co.kr/learn/courses/30/lessons/154540?language=java
핵심 내용
지도를 나타내는 문자열 배열 maps가 매개변수로 주어질 때, 각 섬에서 최대 며칠씩 머무를 수 있는지 배열에 오름차순으로 담아 return 하는 solution 함수를 완성해주세요. 만약 지낼 수 있는 무인도가 없다면 -1을 배열에 담아 return 해주세요.
코드 및 분석(다른 분의 코드)
*주석은 해당 코드 위에 적는 방식으로 적겠습니다.
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
class Solution {
static int sum=0;
public int[] solution(String[] maps) {
List<Integer> list = new ArrayList<>();
# 방문한 node를 기록할 객체 생성합니다.
boolean[][] visited = new boolean[maps.length][maps[0].length()];
# maps의 길이만큰 돌도록 for문 돌립니다.
for(int i=0; i<maps.length; i++) {
for(int j=0; j<maps[i].length(); j++) {
node마다 dfs 함수를 실행합니다.
dfs(maps, visited, i, j);
if(sum>0) {
list.add(sum);
sum=0;
}
}
}
# 조건 중 list가 0이면 -1 값을 return 합니다.
if(list.size()==0) return new int[] {-1};
int[] answer = new int[list.size()];
for(int i=0; i<answer.length; i++) {
answer[i]=list.get(i);
}
# 배열을 오름차순으로 바꿔줍니다.
Arrays.sort(answer);
return answer;
}
public void dfs(String[] maps, boolean[][] visited, int i, int j) {
# 인덱스 값이 0 아래이거나 maps의 길이보다 크면 안되기 때문에 체크를 합니다.
if(i<0 || j<0 || i>=maps.length || j>=maps[0].length()) return;
# 2번째 조건으로 'X'이거나 벌써 사용한 node인지 체크 합니다.
if(maps[i].charAt(j) == 'X' || visited[i][j]) return;
else {
# visited[i][j] 값을 true로 바꿔줍니다.
visited[i][j]=true;
# Ascii code를 사용해서 int로 형변환합니다. '0'의 아스키코드는 48입니다.
sum+=maps[i].charAt(j)-'0';
}
# i와 j 전체를 탐색하도록 dfs를 호출해줍니다.
dfs(maps, visited, i+1, j);
dfs(maps, visited, i-1, j);
dfs(maps, visited, i, j+1);
dfs(maps, visited, i, j-1);
}
}
반응형
'코딩테스트' 카테고리의 다른 글
[프로그래머스 lv1]삼총사 (0) | 2023.05.02 |
---|---|
[프로그래머스 LV1]최대공약수와 최소공배수 (0) | 2023.05.01 |
[프로그래머스 LV2]타겟 넘버 (0) | 2023.04.29 |
[프로그래머스 LV1]행렬의 덧셈 (0) | 2023.04.27 |
[프로그래머스 LV1] 문자열 다루기 기본 (0) | 2023.04.27 |