Leetcode Java Make Array Strictly Increasing
업데이트:
문제
코드
class Solution {
public int makeArrayIncreasing(int[] arr1, int[] arr2) {
Arrays.sort(arr2);
Map<Integer, Integer> dp = new HashMap<>();
dp.put(-1, 0);
for (int num : arr1) {
Map<Integer, Integer> temp = new HashMap<>();
for (Map.Entry<Integer, Integer> entry : dp.entrySet()) {
if (num > entry.getKey()) {
temp.put(num, Math.min(temp.getOrDefault(num, Integer.MAX_VALUE), entry.getValue()));
}
int index = Arrays.binarySearch(arr2, entry.getKey() + 1);
if (index < 0) {
index = -index - 1;
}
if (index < arr2.length) {
temp.put(arr2[index], Math.min(entry.getValue() + 1, temp.getOrDefault(arr2[index], Integer.MAX_VALUE)));
}
}
dp = temp;
}
return dp.isEmpty() ? -1 : Collections.min(dp.values());
}
}
결과
설명
- arr1의 값들을 arr2의 값으로 대체하여 순차적으로 증가시키는 배열로 변환하는 문제이다.
- 순차적으로 증가하는 배열로 변환하지 못하는 경우, -1을 반환한다.
-
arr2의 값을 오름차순으로 정렬한다.
-
dp는 값을 바꾼 값을 저장할 변수로, HashMap으로 초기화하여 key와 value가 -1과 0인 초기 값을 넣어준다.
- arr1의 모든 값을 num에 순차적으로 넣고 아래를 수행한다.
- temp는 dp를 이용하여 대체할 값을 저장할 변수로, HashMap으로 초기화한다.
- dp의 값들을 순차적으로 entry에 넣고 아래를 수행한다.
- num이 entry의 key 값보다 큰 경우, temp의 num번째 값을 꺼내되 값이 없으면 정수의 최대값을 가져와 그 값과 entry의 value 값 중 작은 값을 넣어준다.
- index에 arr2에서 entry의 key 값보다 1 큰 숫자의 다음 위치를 찾아 넣어준다.
- 만일 index가 0보다 작은 경우, index를 양수로 변환하여 1을 빼준다.
- index가 arr2의 길이보다 작은 경우, temp의 arr2[index] 값의 위치에 entry의 value 값보다 1 큰 값과 temp의 arr2[index]번째 값을 꺼내되 값이 없으면 정수의 최댓 값을 가져와 두 값 중 작은 값을 넣어준다.
- dp에 변환된 값이 저장된 temp를 넣어준다.
- dp가 비어으면 변환이 되지 않으므로 -1을, 비어있지 않으면 dp 내 value 중 가장 작은 값을 꺼내서 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기