๋ฌธ์ ํ์
๋ ์ ์ ๋ฐฐ์ด nums1
๊ณผ nums2
๋ ๋น๋ด๋ฆผ์ฐจ์(non-decreasing) ๋ฐฐ์ด์ด๋ค.
๋น๋ด๋ฆผ์ฐจ์ : ๊ฐ์ ํฌ๊ธฐ์ ์์๊ฐ ์กด์ฌํ ์ ์๋ ๊ฒ
ex) 1 2 3
ex) 1 1 2
nums1
๋ฐฐ์ด์ ๊ธธ์ด๋ m+n ์ผ๋ก, ์ฒซ m๋ฒ์งธ๊น์ง์ ์์๋ merged ๋์ด์ผ ํ๊ณ ๋๋จธ์ง n๊ฐ๋ 0์ผ๋ก ์ค์ ๋์ด ์๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ n๊ฐ์ 0 ์ nums2
์ ์์๋ค์ด ๋ค์ด๊ฐ์ผํ๊ณ ์ต์ข
๊ฒฐ๊ณผ๋ ๋น๋ด๋ฆผ์ฐจ์์ผ๋ก ๋ฐํํ๋ฉด ๋๋ค.
ํ์ด
1๏ธโฃ Array.sort()
๊ฐ์ฅ ๊ฐ๋จํ๊ฒ ๋ ์ค๋ฅธ ํ์ด์ด๋ค.
๋จผ์ nums1
๋ฐฐ์ด์ 0 ๋ถ๋ถ์ nums2
๋ฐฐ์ด์ ์์๋ฅผ ์
๋ ฅํ ํ, Arrays.sort()
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
์ ๋ ฅํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค.
nums1
์ m+1 ๋ฒ์งธ ๋ถํฐ m+n๋ฒ์งธ ๊น์ง 0์ผ๋ก ์
๋ ฅ๋์ด ์์ผ๋ฏ๋ก
for(int i=m;i<m+n;i++){
nums1[i] = nums2[i-m];
}
์์ ๊ฐ์ for๋ฌธ์ ์ํํ๋ฉด ๋๋ค.
import java.util.*;
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
for (int i = m; i < m + n; i++) {
nums1[i] = nums2[i - m];
}
Arrays.sort(nums1);
}
}
๐ก ์ฐธ๊ณ ๋กArrays.sort()
๋ DualPivotQuickSort ๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋๋ฐ,
ํ๊ท ์๊ฐ ๋ณต์ก๋๋ O(NlogN) ์ด๊ณ ์ต์ ์ธ ๊ฒฝ์ฐ O(N^2) ์ด๋ผ๊ณ ํ๋ค.
๊ฒฐ๊ณผ
2๏ธโฃ ํฌ์ธํฐ ๋ฐฉ์ (์คํจ)
O(m+n) ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํด๋ณด์๋ค.
nums1
๊ณผ nums2
๊ฐ ๋๋ค ์ ๋ ฌ๋์ด ์๊ธฐ ๋๋ฌธ์
ํฌ์ธํฐ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
import java.util.*;
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] result = new int[m + n];
int idx1 = 0;
int idx2 = 0;
for (int i = 0; i < m + n; i++) {
if (idx1 < m && idx2 < n) {
if (nums1[idx1] >= nums2[idx2]) {
result[i] = nums2[idx2++];
} else {
result[i] = nums1[idx1++];
}
} else if (idx2 >= n) {
result[i] = nums1[idx1++];
} else if (idx1 >= m) {
result[i] = nums2[idx2++];
}
}
nums1 = result;
}
}
์ด๋ ๊ฒ ํ๊ณ ๋๋, ์ ์ถ๋ ฅ์ด ๋์ด ํต๊ณผํ ์ค ์์์ง๋ง ํต๊ณผํ์ง ๋ชปํ๋ค.
๋ฌธ์ ์
The final sorted array should not be returned by the function, but instead be stored inside the array nums1.
์์ ๊ฐ์ ๋ฌธ๊ตฌ๊ฐ ์์๋๋ฐ, nums1
๋ฐฐ์ด์ ๋ฉ๋ชจ๋ฆฌ ์์น๊ฐ ๋ณํํ๋ฉด ์ธ์ ์ ์ํด์ฃผ๋ ๊ฒ ๊ฐ๋ค.
๋ฐ๋ผ์ ๋ค๋ฅธ ํ์ด๋ฅผ ์๊ฐํด์ผ ํ๋ค.
3๏ธโฃ ํฌ์ธํฐ ๋ฐฉ์
ํ์ด 2์ ๊ฑฐ์ ์ ์ฌํ๊ฒ ํด๊ฒฐํ ์ ์์๋ค.
nums1
์ ๋ท ๋ถ๋ถ ๊ณต๊ฐ์ด 0์ผ๋ก ๋น์์ ธ ์๊ธฐ ๋๋ฌธ์, ์ด ๊ณต๊ฐ์ ํ์ฉํ๋ค.
๋ท ๊ณต๊ฐ ๋ถํฐ ๊ฐ์ ์ฑ์๋๊ฐ์ผ ํ๊ธฐ ๋๋ฌธ์,
nums1
์ nums2
๋ ์๋ก๊ฐ ๊ฐ์ง ๊ฐ์ฅ ํฐ ๊ฐ์ ๋น๊ตํ๊ณ , ๊ทธ ์ค ํฐ ๊ฐ์ ์ฑ์๋๊ฐ์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ , ์ฑ์ฐ๋๋ฐ ์ฌ์ฉํ ๋ฐฐ์ด์ ํฌ์ธํฐ๋ 1 ๊ฐ์์ํค๋ฉด ๋๋ค.
3๊ณผ 6์ค 6์ด ํฌ๋ฏ๋ก 6์ด ์ ์ผ ๋ค์ ์ฑ์์ง๊ณ nums2
์ ํฌ์ธํฐ๋ 1๊ฐ์ํ ๊ฒ์ด๋ค.
๋, 3๊ณผ 5๋ฅผ ๋น๊ตํ๋ฉด, 5๊ฐ ํฌ๋ฏ๋ก 5๊ฐ ์ฑ์์ง๊ณ nums2
์ ํฌ์ธํฐ๋ 1 ๊ฐ์ํ๋ค.
๋ค์์, nums1
์ 3์ด ํฌ๋ฏ๋ก 3์ด ์ฑ์์ง๊ณ nums1
์ ํฌ์ธํฐ๊ฐ 1 ๊ฐ์ํ๋ค.
์ด๋ฐ์์ผ๋ก ์ฑ์๋๊ฐ๋ฉด ์ ๋ต์ ๊ตฌํ ์ ์๋ค.
import java.util.*;
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int idx1 = m - 1;
int idx2 = n - 1;
for (int i = m + n - 1; i >= 0; i--) {
if (idx1 >= 0 && idx2 >= 0) {
if (nums1[idx1] <= nums2[idx2]) {
nums1[i] = nums2[idx2--];
} else {
nums1[i] = nums1[idx1--];
}
} else if (idx2 < 0) {
nums1[i] = nums1[idx1--];
} else if (idx1 < 0) {
nums1[i] = nums2[idx2--];
}
}
}
}
๊ฒฐ๊ณผ
๐ ํ๊ณ
๊ฐ๋จํ ๋ฌธ์ ๋ผ๋, ์๊ฐ ๋ณต์ก๋๋ฅผ ์ค์ผ ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ ์์๊น? ๊ณ ๋ฏผ์ ํด๋ด์ผ๊ฒ ๋ค.
๊ทธ๋ฆฌ๊ณ Arrays.sort()
๋ฅผ ํญ์ ์๊ฐ์์ด ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์๋ฐ, ์ด ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ ๋ ฌ๋๋์ง, ์ด๋ค ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ๊ณ ์๋์ง๋ฅผ ์๊ฒ๋์๋ค.