Leetcode Java Largest Divisible Subset
업데이트:
문제
코드
class Solution {
public List<Integer> largestDivisibleSubset(int[] nums) {
int length = nums.length;
int[][] dp = new int[length][2];
Arrays.sort(nums);
int max = 0;
int index = -1;
for (int i = 0; i < length; i++) {
dp[i][0] = 1;
dp[i][1] = -1;
for (int j = 0; j < i; j++) {
if (nums[i] % nums[j] == 0 && dp[j][0] + 1 > dp[i][0]) {
dp[i][0] = dp[j][0] + 1;
dp[i][1] = j;
}
}
if (dp[i][0] > max) {
max = dp[i][0];
index = i;
}
}
List<Integer> result = new ArrayList<Integer>();
while (index != -1) {
result.add(nums[index]);
index = dp[index][1];
}
return result;
}
}
결과
설명
- 주어진 정수 배열인 nums를 이용하여 아래의 조건을 만족하는 배열을 만드는 문제이다.
- 주어진 문제의 결과로 반환하는 answer에 들어가는 값들은 answer[i] % answer[j] == 0 혹은 answer[j] % answer[i] == 0을 만족해야 한다.
- 문제 풀이에 필요한 변수를 정의한다.
- length는 nums의 길이를 저장하기 위한 변수로, nums.length로 초기화한다.
- dp는 주어진 문제의 조건에 해당하는 값을 찾기 위한 임시 배열로, 그 전의 위치를 순차적으로 담기 위해 dp[length][2]로 초기화한다.
- max는 최대 값을 저장하기 위한 임시 변수로, 0으로 초기화한다.
- index는 nums의 위치 값을 임시 저장하기 위한 임시 변수로, -1로 초기화 한다.
- nums를 오름차순으로 정렬하고, nums의 모든 값을 앞에서부터 반복한다.
- dp[i][0]은 1로, dp[i][1]은 -1로 초기화 한다.
- 0부터 i까지 j를 증가시키며 반복하여, 아래를 검증하여 값을 설정한다.
- nums[i]의 값과 nums[j]의 값의 나눈 나머지 값이 0이고 $dp[j][0] + 1$의 값이 dp[i][0]의 값보다 큰 경우, dp[i][0]에 dp[j][0] + 1 값을 dp[i][1]에 j를 넣어준다.
- dp[i][0]의 값이 max보다 큰 경우, max에 dp[i][0]의 값을 index에 i를 넣어주고 반복을 계속 수행한다.
- 결과를 넣을 List인 result를 정의하고, index가 -1이 아닐 때 까지 반복한다.
- result에 조건을 만족하는 값인 nums의 index번째 값을 넣어주고, index에 이전의 값이 존재하는 위치인 dp[index][1] 값을 넣어준다.
- 최초 정의한 index인 -1이 되기 전까지 반복을 수행하여 조건에 만족하는 값들을 result에 모두 넣어준다.
- 반복이 완료되면 문제의 조건을 만족하는 결과를 넣은 List인 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기