Merge Sorted Array

๊ฐœ๋А๋ฆผ...

public static 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(nums1) ๋•Œ๋ฌธ์ž„.

for(int i = m; i < m + n; i++) {
    nums1[i] = nums2[i - m]; // nums2์˜ ์š”์†Œ๋ฅผ nums1์˜ ๋’ค์ชฝ์— ๋ณต์‚ฌ
}
Arrays.sort(nums1); // ์ „์ฒด ๋ฐฐ์—ด์„ ๋‹ค์‹œ ์ •๋ ฌ

์ด ์ฝ”๋“œ์—์„œ Arrays.sort(nums1) ๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ O((m+n)log(m+n))O((m+n) log(m + n)) ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง.

์ฆ‰, ๊ธฐ์กด์˜ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ํ™œ์šฉํ•˜์ง€ ์•Š๊ณ , ๊ฐ•์ œ๋กœ ๋‹ค์‹œ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹ ์ด๋ผ ๋น„ํšจ์œจ ์ ์ž„.


โœ… ๊ฐœ์„  ๋ฐฉ๋ฒ•: ๋ณ‘ํ•ฉ ์ •๋ ฌ (Two Pointers) ํ™œ์šฉ

์ด ๋ฌธ์ œ๋Š” ๋‘ ๊ฐœ์˜ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ณผ์ • ์ด๋ฏ€๋กœ, ์ด๋ฏธ ์ •๋ ฌ๋œ ๋‘ ๋ฐฐ์—ด์„ ํ™œ์šฉํ•ด ๋’ค์—์„œ๋ถ€ํ„ฐ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ์‹(์—ญ์ˆœ ๋ณ‘ํ•ฉ) ์„ ์‚ฌ์šฉํ•˜๋ฉด ํšจ์œจ์ ์ž„.

โŒ›์‹œ๊ฐ„ ๋ณต์žก๋„ : O(m+n)O(m + n) (์ •๋ ฌ ์—†์ด ๋ณ‘ํ•ฉ๋งŒ ์ˆ˜ํ–‰)

๐Ÿ“Œ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)O(1) (์ถ”๊ฐ€ ๊ณต๊ฐ„ ์—†์ด nums1 ๋‚ด๋ถ€์—์„œ ์ง์ ‘ ๋ณ‘ํ•ฉ)


๐Ÿš€ ๊ฐœ์„ ๋œ ์ฝ”๋“œ(Two Pointers, ์—ญ์ˆœ ๋ณ‘ํ•ฉ)

import java.util.Arrays;

public class MergeSortedArray{
    public static void merge(int[] nums1, int m, int[] nums2, int n) {
        int p1 = m - 1; // nums1 ์˜ ๋งˆ์ง€๋ง‰ ์‹ค์ œ ์š”์†Œ ์œ„์น˜
        int p2 = n - 1; // nums2 ์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ ์œ„์น˜
        int p = m + n - 1; // ๋ณ‘ํ•ฉ ํ›„ nums1์˜ ๋งˆ์ง€๋ง‰ ์œ„์น˜
        
        while(p1 >= 0 && p2 >= 0) {
            if(nums1[p1] > nums2[p2]) {
                nums1[p] = nums1[p1];
                p1--;
            } else {
                nums1[p] = nums2[p2];
                p2--;
            }
            p--;
        }
        
        // nums2 ์˜ ๋‚จ์€ ์š”์†Œ ์ฒ˜๋ฆฌ (nums1์€ ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•  ํ•„์š”๋Š” ์—†์Œ.)
        while(p2 >= 0) {
            nums1[p] = nums2[p2];
            p2--;
            p--;
        }
    }
    // ํ…Œ์ŠคํŠธ ์‹คํ–‰
    public static void main(String[] args) {
       int[] nums1 = {1, 2, 3, 0, 0, 0};
       int m = 3;
       int[] nums2 = {2, 5, 6};
       int n = 3;

       merge(nums1, m, nums2, n);
       System.out.println(Arrays.toString(nums1)); // ์ถœ๋ ฅ: [1, 2, 2, 3, 5, 6] 
    }
}

๐Ÿ“Œ ์ฝ”๋“œ ์„ค๋ช…

  1. ํฌ์ธํ„ฐ 3๊ฐœ ์„ค์ •

    1. p1 = m - 1 : nums1 ์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ ์œ„์น˜ (์œ ํšจ ๋ฐ์ดํ„ฐ ๋ฒ”์œ„)

    2. p2 = n - 1 : nums2 ์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ ์œ„์น˜

    3. p = m + n - 1 : nums1 ์˜ ๋งˆ์ง€๋ง‰ ๋นˆ ๊ณต๊ฐ„๋ถ€ํ„ฐ ์ฑ„์šฐ๊ธฐ ์‹œ์ž‘

  2. **๋’ค์—์„œ๋ถ€ํ„ฐ ํฐ ๊ฐ’์„ ์„ ํƒํ•˜์—ฌ ๋ฐฐ์น˜(O(m+n)O(m+n))

    1. nums1[p1] ๊ณผ nums2[p2] ๋ฅผ ๋น„๊ต

    2. ํฐ ๊ฐ’์„ nums1[p] ์— ๋ฐฐ์น˜ ํ›„ ํ•ด๋‹น ํฌ์ธํ„ฐ ๊ฐ์†Œ

    3. p1 ๋˜๋Š” p2 ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

  3. ๋‚จ์€ nums2 ์š”์†Œ ์ฒ˜๋ฆฌ

    1. nums2 ์˜ ๋‚จ์€ ์š”์†Œ๊ฐ€ ์žˆ๋‹ค๋ฉด nums1 ์•ž๋ถ€๋ถ„์— ๋ณต์‚ฌ


๐Ÿ“Œ ์™œ ๋” ๋น ๋ฅธ๊ฐ€?

  • ์ •๋ ฌ (O((m+n)log(m+n))O((m+n) log(m+n))) ์„ ์ œ๊ฑฐํ•˜๊ณ  O(m+n) ์œผ๋กœ ์ตœ์ ํ™”

  • ํ•œ ๋ฒˆ์˜ ๋ฐ˜๋ณต๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ์ถ”๊ฐ€ ๊ณต๊ฐ„(O(1)) ์—†์ด ํ•ด๊ฒฐ

  • ์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ํ™œ์šฉํ•˜์—ฌ ํšจ์œจ์  ์ •๋ ฌ ์œ ์ง€


๐Ÿš€์„ฑ๋Šฅ์ฐจ์ด

์ฝ”๋“œ ๋ฐฉ์‹
์‹œ๊ฐ„ ๋ณต์žก๋„
๊ณต๊ฐ„ ๋ณต์žก๋„
ํŠน์ง•

๊ธฐ์กด ์ฝ”๋“œ (Arrays.sort())

O((m+n) log(m+n))

O(1)

์ •๋ ฌ์„ ๋ฌด์กฐ๊ฑด ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ๋น„ํšจ์œจ์ 

๊ฐœ์„  ์ฝ”๋“œ (Two Pointers)

O(m + n)

O(1)

์ง์ ‘ ๋ณ‘ํ•ฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ •๋ ฌ ์ œ๊ฑฐ

๐Ÿ‘‰ ๋ฐฐ์—ด์ด ์ •๋ ฌ๋œ ์ƒํƒœ์ด๋ฏ€๋กœ, ๋ถˆํ•„์š”ํ•œ sort()๋ฅผ ์—†์• ๊ณ  ๋’ค์—์„œ๋ถ€ํ„ฐ ๋ณ‘ํ•ฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋จ! ๐Ÿš€

Last updated

Was this helpful?