๋ณธ ๊ธ์ 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 ํ์ด ๋ณด๋ฌ๊ฐ๊ธฐ