Leetcode Java Create Maximum Number
업데이트:
문제
코드
class Solution {
public int[] maxNumber(int[] nums1, int[] nums2, int k) {
int[] result = new int[k];
for (int i = Math.max(0, k - nums2.length); i <= Math.min(nums1.length, k); i++) {
int[] maxNums1 = this.findMax(nums1, i);
int[] maxNums2 = this.findMax(nums2, k - i);
int[] merge = this.merge(maxNums1, maxNums2);
if (this.isGreater(merge, result, 0, 0)) {
result = merge;
}
}
return result;
}
private boolean isGreater(int[] nums1, int[] nums2, int i, int j) {
while (i < nums1.length && j < nums2.length) {
if (nums1[i] > nums2[j]) {
return true;
} else if (nums1[i] < nums2[j]) {
return false;
} else {
i++;
j++;
}
}
return i < nums1.length;
}
private int[] merge(int[] nums1, int[] nums2) {
int i = 0;
int j = 0;
int length = nums1.length + nums2.length;
int[] result = new int[length];
for (int k = 0; k < length; k++) {
if (this.isGreater(nums1, nums2, i, j)) {
result[k] = nums1[i++];
} else {
result[k] = nums2[j++];
}
}
return result;
}
private int[] findMax(int[] nums, int k) {
int j = 0;
int length = nums.length;
int[] result = new int[k];
for (int i = 0; i < length; i++) {
while (j > 0 && result[j - 1] < nums[i] && j + length - i > k) {
j--;
}
if (j < k) {
result[j++] = nums[i];
}
}
return result;
}
}
결과
설명
- 주어진 정수 배열 nums1과 nums2를 이용하여 아래의 조건을 만족하는 k 크기의 최대 값을 가진 배열을 만드는 문제이다.
- 주어진 정수 k는 nums1과 nums2의 길이보다 같거나 작은 숫자로 주어진다.
- nums1과 nums2의 각 배열의 상대적 순서를 유지하여 k 크기의 배열에 크기순으로 넣은 배열이 가장 큰 경우의 배열을 찾아 주어진 문제의 결과로 반환한다.
-
결과를 넣을 result 배열을 k크기로 초기화한다.
-
0과 $k - nums2.length$의 값중 큰 값부터 nums1.length와 k 중 작은 값 까지 반복하여 result에 문제의 결과를 넣어준다.
- maxNums1에 nums1의 값들 중 가장 큰 값을 포함한 일련된 i개의 숫자로 배열을 만들어 넣어주고, maxNums2에 nums2의 값들 중 가장 큰 값을 포함한 일련된 $k - i$개의 숫자로 배열을 만들어 넣어준다.
- findMax(int[] nums, int k) 메서드는 nums의 숫자들을 모두 순회하여 일련된 가장 큰 값을 포함한 k개의 숫자로 배열을 만들어 넣어준다.
- 4번을 통해 큰 값들을 찾은 두 배열인 maxNums1과 maxNums2를 숫자 크기의 내림차순으로 합친 배열을 merge에 넣어준다.
- merge(int[] nums1, int[] nums2) 메서드는 nums1과 nums2의 값들이 들어갈 크기의 배열을 선언하여 어느 값이 큰지를 isGreater(int[] nums1, int[] nums2, int i, int j) 메서드를 이용하여 검증하여 해당 배열에 넣어주고, 해당 배열을 반환한다.
-
isGreater(int[] nums1, int[] nums2, int i, int j) 메서드를 이용하여 merge와 result를 처음 값부터 비교하여 어느 배열이 순차적으로 큰 값으로 존재하는지를 검증하고, merge가 큰 경우 result에 넣고 반복을 계속 수행한다.
- 반복이 완료되면 nums1과 nums2의 각 배열의 상대적 순서를 유지하여 k 크기의 배열에 크기순으로 넣은 배열이 가장 큰 경우의 배열인 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기