๋ณธ ๊ธ์ 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 ํ์ด ๋ณด๋ฌ๊ฐ๊ธฐ
'IN DEPTH CAKE > Supercoder' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ฝ๋ฉ/LeetCode150-(6)] Rotate Array (189) (0) | 2023.08.20 |
---|---|
[์ฝ๋ฉ/LeetCode150-(5)] Majority Element (169) (2) | 2023.08.18 |
[์ฝ๋ฉ/LeetCode150-(4)] Remove Duplicates from Sorted Array II(80) (2) | 2023.08.18 |
[์ฝ๋ฉ/LeetCode150-(3)] Remove Duplicates from Sorted Array (26) (2) | 2023.08.17 |
[์ฝ๋ฉ/LeetCode150-(2)] Remove Element (27) (1) | 2023.08.17 |