์ƒˆ์†Œ์‹

IN DEPTH CAKE/Supercoder

[์ฝ”๋”ฉ/LeetCode150-(1)] Merge Sorted Array (88)

  • -
๋ฐ˜์‘ํ˜•

 

 

 

 

 

๋ณธ ๊ธ€์€ LeetCode Top Interview 150์— ์ •๋ฆฌ๋œ ๋ฌธ์ œ๋ฅผ ์š”์•ฝํ•˜๊ณ  ์ด์— ๋Œ€ํ•œ ๊ฐœ์ธ์ ์ธ ํ’€์ด๋ฅผ ํฌํ•จํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ณธ ํฌ์ŠคํŒ… ์‹œ๋ฆฌ์ฆˆ๋Š” 150 list์˜ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ผ์„œ ๊ฒŒ์žฌ๋ฉ๋‹ˆ๋‹ค. ํ’€์ด ์–ธ์–ด๋Š” python์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

 

๋‚œ์ด๋„: EASY

ํ‚ค์›Œ๋“œ: Array, Two-Pointers

 

 

๋ฌธ์ œ

 

๋ฌธ์ œ ์›๋ฌธ: https://leetcode.com/problems/merge-sorted-array/?envType=study-plan-v2&envId=top-interview-150

 

๊ฐ์†Œํ•˜์ง€ ์•Š๋Š” ํ˜•ํƒœ๋กœ ์ •๋ ฌ๋œ ๋‘ ๊ฐœ์˜ integer array nums1 ์ด๋ž‘ nums2์˜ ๊ฐ๊ฐ์˜ ๊ธธ์ด (์ •์ˆ˜๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด๋ถ€๋ถ„์˜ ๊ธธ์ด)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ๊ฐœ์˜ ์ •์ˆ˜ m๊ณผ n์ด ์ฃผ์–ด์กŒ๋‹ค. ๋‘ ๊ฐœ์˜ array๋ฅผ ๊ฐ์†Œํ•˜์ง€ ์•Š๋Š” ์ˆœ์œผ๋กœ (non-decreasing order) ์ •๋ ฌํ•ด๋ผ.

๋‹จ, ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ์€ ์ƒˆ๋กœ์šด array๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  nums1 ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ ์• ์ดˆ์— nums1 ์˜ ์ „์ฒด ๊ธธ์ด๋Š” m+n์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

 

์˜ˆ์ œ ์ž…๋ ฅ 

Input: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
Output: [1,2,2,3,5,6]
Explanation: The arrays we are merging are [1,2,3] and [2,5,6].
The result of the merge is [1,2,2,3,5,6] with the underlined elements coming from nums1.

 

 

ํ’€์ด

 

1) ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ• (Runtime Beats 73.85 %,  Memory Beats 55.55 %)

 

  • nums1 ๋ฐฐ์—ด์— ๋งˆ์ € ์ฑ„์›Œ๋†“๊ณ  ์ •๋ ฌํ•˜๊ธฐ
  • ๋„ˆ๋ฌด trivialํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ํ•˜์ง€๋งŒ ์˜์™ธ๋กœ runtime์ด ๋น ๋ฅธ ํŽธ (๋‚ด ์ฝ”๋“œ๋ณด๋‹ค ์ž˜๋ผ์žˆ๋Š” python sort algorith... ๐Ÿฅน)
๋”๋ณด๊ธฐ

์ฐธ๊ณ ๋กœ python์˜ sort()๋Š” TimSort๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ตœ์•… ์‹œ๊ฐ„ ๋ณต์žก๋„ $O(n \log n)$, ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„ $O(n \log n)$, ๊ณต๊ฐ„ ๋ณต์žก๋„ $O(n)$

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        for i in range(n):
            nums1[m+i] = nums2[i]
        nums1.sort()

 

2) ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉํ•˜๊ธฐ

  • 1๋ฒˆ๊ณผ ๋”๋ถˆ์–ด ์ด ๋ฐฉ๋ฒ•์€ ๋„ˆ๋ฌด trivial ํ•˜๋‹ˆ๊นŒ ํŒจ์Šค, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์—์„œ ์ด๋“์ด ์—†์Œ

 

 

3) ์ •๋ ฌ๋˜์–ด์žˆ๋Š” ์ •๋ณด ํ™œ์šฉํ•˜๊ธฐ (Runtime Beats 49.85 %,  Memory Beats 83.85 %)

 

  • ์ฐธ๊ณ ๋กœ ์•ž์—์„œ๋ถ€ํ„ฐ inplace๋กœ ๋Œ€์ฒดํ•˜๋ฉด ์œ ์ง€ํ•ด์•ผํ•˜๋Š” ์ •๋ณด๊ฐ€ ๋งŽ์•„์ง
    (in-place๋˜๋Š” ์ •๋ณด๋ฅผ ๋’ท ๋ถ€๋ถ„์— ์ €์žฅํ•ด๋†“๊ณ  ๋น„๊ตํ• ๋•Œ๋งˆ๋‹ค ๋ณต์žกํ•œ ์กฐ๊ฑด์ด ํ•„์š”ํ•จ)
  • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—ญ์œผ๋กœ ๋’ค์—์„œ๋ถ€ํ„ฐ ์ฑ„์šฐ๋ฉด ๋œ๋‹ค.
  • ์ด ์•„์ด๋””์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ธ ๊ฐœ์˜ pointer๋กœ merge ๊ฐ€๋Šฅ
    ์ผ๋ฐ˜์ ์œผ๋กœ array ๋ฌธ์ œ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” Two pointers ๊ธฐ๋ฒ•์„ ์‘์šฉํ•ด์„œ current pointer๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉ

 

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """

        curr, left, right = m+n-1, m-1, n-1
        while left >= 0 and right >= 0:

            if nums1[left] > nums2[right]:
                nums1[curr] = nums1[left]
                left -= 1
            else:
                nums1[curr] = nums2[right]
                right -= 1
            curr -= 1
        # only if right elements are remain
        if right >= 0:
            while right >= 0:
                nums1[curr] = nums2[right]
                right -= 1
                curr -= 1

 

์ฐธ๊ณ ๋กœ, ์ด ์ฝ”๋“œ์—์„œ nums1์€ ์ด๋ฏธ left ์ดํ•˜์˜ ์•ž์ชฝ ๋ถ€๋ถ„์ด sorting๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— left index๊ฐ€ >=0์ธ ๊ฒฝ์šฐ๋Š” ๋ณ„๋„๋กœ mergeํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ด ์•„์ด๋””์–ด๋Š” merge sort ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์•„์ด๋””์–ด๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ–ˆ๋‹ค.

 

 

Takeaway

 

  • in-place๋กœ mergeํ•  ๋•Œ, ์•ž์ชฝ๋ถ€ํ„ฐ merge๋ฅผ ํ•˜๊ฒŒ๋˜๋ฉด num1์— ์ด๋ฏธ ์žˆ๋Š” ๊ฐ’๋“ค์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ฒŒ๋œ๋‹ค. ์ด๋ฅผ ๋’ค์ง‘์–ด์„œ ํฐ ์ˆ˜๋ถ€ํ„ฐ ๋น„๊ตํ•ด์„œ ๋’ค์ชฝ์—์„œ๋ถ€ํ„ฐ merge๋ฅผ ํ•ด์ฃผ๊ฒŒ ๋˜๋ฉด ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‚ด๊ฐ€ ๋ถ™์ธ ํ‚ค์›Œ๋“œ: Two pointers, Merge Sort

 

๐Ÿ“š LeetCode 75 / Code Signal ํ’€์ด ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

 

 

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

# ๋กœ๋”ฉ ํ™”๋ฉด ๋™์ž‘ ์ฝ”๋“œ(Code) ์„ค์ •ํ•˜๊ธฐ