๐ [LeetCode] 88.Merge Sorted Array.
- Difficulty: Easy
- Topic: Array, Two Pointer, Sorting
Approach 1: Merge and sort
Intuition(์ง๊ด)
์์งํ ์ ๊ทผ ๋ฐฉ์์ nums2
์ ๊ฐ์ ๊ทธ์ nums1
์ ๋์ ์ฐ๊ณ , ๊ทธ๋ค์ nums1
์ ์ ๋ ฌํ๋ ๊ฒ์
๋๋ค.
์ฐ๋ฆฌ๋ ๊ฐ์ ๋ฐํํ ํ์๊ฐ ์์ผ๋ฉฐ, nums1
์ ์ง์ ์์ ํด์ผ ํฉ๋๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฝ๋ฉํ๊ธฐ๋ ์ฝ์ง๋ง, ์ด๋ฏธ ์ ๋ ฌ๋ ์ํ๋ฅผ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๋์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
Implementation(๊ตฌํ)
class Solution {
func merge(_ nums1: inout [Int], _ m: Int, _ nums2: [Int], _ n: Int) {
for i in 0..<n {
nums1[i + m] = nums2[i]
}
nums1.sort()
}
}
- Time complexity(์๊ฐ ๋ณต์ก๋):
O((n + m) log(n+m))
- ๋ด์ฅ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๊ธธ์ด๊ฐ
x
์ธ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๋ ๋น์ฉ์O(xlogx)
์ ๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ๊ธธ์ด๊ฐm+n
์ธ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๋ฏ๋ก ์ด ์๊ฐ ๋ณต์ก๋๋O((n + m) log(n + m))
๊ฐ ๋ฉ๋๋ค.
- ๋ด์ฅ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๊ธธ์ด๊ฐ
- Space complexity(๊ณต๊ฐ ๋ณต์ก๋):
O(n)
, ํ์ง๋ง ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค.- ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋
O(n)
๊ณต๊ฐ์ ์ฌ์ฉํ๋ ๋ด์ฅ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋
Approach 2: Three Pointers (Start From the Beginning)
Intuition(์ง๊ด)
๊ฐ ๋ฐฐ์ด์ด ์ด๋ฏธ ์ ๋ ฌ๋์ด ์๊ธฐ ๋๋ฌธ์, Two pointer ๊ธฐ๋ฒ์ ํ์ฉํ๋ฉด O(n+m)
์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
Algorithm
nums1
์ ๊ฐ์ ๋ณต์ฌํ์ฌ nums1Copy
๋ผ๋ ์ ๋ฐฐ์ด์ ๋ง๋๋ ๊ฒ์ด ๊ฐ์ฅ ๊ฐ๋จํ ๊ตฌํ ๋ฐฉ๋ฒ์
๋๋ค.
๊ทธ๋ฐ ๋ค์ ๋ ๊ฐ์ ์ฝ๊ธฐ(read) ํฌ์ธํฐ์ ํ๋์ ์ฐ๊ธฐ(write) ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ nums1Copy
์ nums2
์์ ๊ฐ์ ์ฝ๊ณ nums1
์ ์๋๋ค.
-
nums1Copy
๋ฅผnums1
์ ์ฒ์m
๊ฐ์ด ํฌํจ๋ ์ ๋ฐฐ์ด๋ก ์ด๊ธฐํํฉ๋๋ค. - ์ฝ๊ธฐ ํฌ์ธํฐ
p1
์nums1Copy
์ ์์ ๋ถ๋ถ์ ์ด๊ธฐํํฉ๋๋ค. - ์ฝ๊ธฐ ํฌ์ธํฐ
p2
๋ฅผnums2
์ ์์ ๋ถ๋ถ์ ์ด๊ธฐํํฉ๋๋ค. - ์ฐ๊ธฐ ํฌ์ธํฐ
p
๋ฅผnums1
์ ์์ ๋ถ๋ถ์ ์ด๊ธฐํํฉ๋๋ค. - p๊ฐ ์ฌ์ ํ
nums1
๋ด์ ์๋ ๋์:-
nums1Copy[p1]
์ด ์กด์ฌํ๊ณnums2[p2]
๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด:-
nums1Copy[p1]
์nums1[p]
์ ์ฐ๊ณp1
์1
์ฆ๊ฐ์ํต๋๋ค.
-
- ๊ทธ๋ ์ง ์์ผ๋ฉด
-
nums2[p2]
๋ฅผnums1[p]
์ ์ฐ๊ณp2
๋ฅผ1
์ฆ๊ฐ์ํต๋๋ค.
-
-
p
๋ฅผ1
์ฆ๊ฐ์ํต๋๋ค.
-
class Solution {
func merge(_ nums1: inout [Int], _ m: Int, _ nums2: [Int], _ n: Int) {
// nums1์ ์ฒ์ m๊ฐ ์์์ ๋ณต์ฌ๋ณธ์ ๋ง๋ญ๋๋ค.
let nums1Copy = Array(nums1[0..<m])
// nums1Copy์ nums2์ ๋ํ ์ฝ๊ธฐ ํฌ์ธํฐ์
๋๋ค.
var p1 = 0
var p2 = 0
// nums1Copy์ nums2์์ ์์๋ฅผ ๋น๊ตํ์ฌ ๋ ์์ ๊ฒ์ nums1์ ์๋๋ค.
for p in 0..<(m + n) {
// p1๊ณผ p2๊ฐ ๊ฐ๊ฐ์ ๋ฐฐ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์๋๋ก ํ์ธํฉ๋๋ค.
if p2 >= n || (p1 < m && nums1Copy[p1] < nums2[p2]) {
nums1[p] = nums1Copy[p1]
p1 += 1
} else {
nums1[p] = nums2[p2]
p2 += 1
}
}
}
}
Complexity Analysis
- Time complexity(์๊ฐ ๋ณต์ก๋) :
O(n+m)
- ์ฐ๋ฆฌ๋
n+2*m
๋ฒ์ ์ฝ๊ธฐ์n+2*m
๋ฒ์ ์ฐ๊ธฐ๋ฅผ ์ํํ๊ณ ์์ต๋๋ค. Big O ํ๊ธฐ๋ฒ์์ ์์๋ ๋ฌด์๋๋ฏ๋ก, ์ด๋O(n+m)
์ ์๊ฐ ๋ณต์ก๋๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์ฐ๋ฆฌ๋
- Space complexity(๊ณต๊ฐ ๋ณต์ก๋) :
O(m)
- ์ฐ๋ฆฌ๋ ์ถ๊ฐ์ ์ผ๋ก ๊ธธ์ด๊ฐ
m
์ธ ๋ฐฐ์ด์ ํ ๋นํ๊ณ ์์ต๋๋ค.
- ์ฐ๋ฆฌ๋ ์ถ๊ฐ์ ์ผ๋ก ๊ธธ์ด๊ฐ
Approach 3: Three Pointers (Start From the End)
Intuition
์ธํฐ๋ทฐ ํ: ์ด๊ฒ์ ์ฌ์ด ๋ฌธ์ ์ ๋ํ ์ค๊ฐ ์์ค์ ์๋ฃจ์ ์ ๋๋ค.
์ฌ์ด ์์ค์ ๋ฌธ์ ์ค ์๋น์๋ ๋ ์ด๋ ค์ด ํด๊ฒฐ์ฑ ์ ๊ฐ๊ณ ์์ผ๋ฉฐ,
์ข์ ์ง์์๋ ์ด๋ฅผ ์ฐพ์๊ฒ์ผ๋ก ์์๋ฉ๋๋ค.
Approach 2๋ ์ด๋ฏธ ์ต์์ ์๊ฐ ๋ณต์ก๋์ธ O(n+m)
์ ๋ณด์ฌ์ฃผ์ง๋ง, ์ฌ์ ํ ์ถ๊ฐ ๊ณต๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
์ด๋ nums1
๋ฐฐ์ด์ ์์๋ค์ ์ด๋๊ฐ์ ์ ์ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์, ๊ทธ๊ฒ๋ค์ด ๋ฎ์ด์ฐ์ฌ์ง์ง ์๋๋ก ํด์ผํ๊ธฐ ๋๋ฌธ์
๋๋ค
๊ทธ๋ ๋ค๋ฉด ๋์ nums1
์ ๋๋ถํฐ ๋ฎ์ด์ฐ๊ธฐ ์์ํ๋ฉด ์ด๋จ๊น์? ๊ฑฐ๊ธฐ์๋ ์์ง ์ ๋ณด๊ฐ ์์ผ๋๊น์.
์๊ณ ๋ฆฌ์ฆ์ ์ด์ ๊ณผ ์ ์ฌํ์ง๋ง, ์ด๋ฒ์๋ p1
์ nums1
์ m - 1
์ธ๋ฑ์ค์, p2
๋ฅผ nums2
์ n - 1
์ธ๋ฑ์ค์, ๊ทธ๋ฆฌ๊ณ p
๋ฅผ nums1
์ m + n - 1
์ธ๋ฑ์ค์ ๋๋ ๋ฐฉ์์
๋๋ค.
์ด ๋ฐฉ์์ผ๋ก, nums1
์ ์ฒ์ m
๊ฐ๋ค์ ๋ฎ์ด์ฐ๊ธฐ ์์ํ ๋, ์ด๋ฏธ ๊ฐ๊ฐ์ ์ ์์น์ ์จ ๋์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ด ๋ณด์ฅ๋ฉ๋๋ค.
์ด๋ฐ ๋ฐฉ์์ผ๋ก, ์ถ๊ฐ ๊ณต๊ฐ์ ์์จ ์ ์์ต๋๋ค.
์ธํฐ๋ทฐ ํ: ๋ฒ ์ด ๋ฌธ์ ๋ฅผ ์ ์๋ฆฌ์์ ํด๊ฒฐํ๋ ค๊ณ ํ ๋๋ ํญ์ ๋ฐฐ์ด์ ์์์ ๋ค๋ก ์ํํ๋ ๋์ ๋ค์์ ์์ผ๋ก ์ํํ๋ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํด๋ณด์ธ์
์ด๊ฒ์ ๋ฌธ์ ๋ฅผ ์์ ํ ๋ฐ๊พธ์ด ๋๊ณ , ํจ์ฉ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
Implementation
1๏ธโฃ
2๏ธโฃ
3๏ธโฃ
4๏ธโฃ
5๏ธโฃ
6๏ธโฃ
class Solution {
func merge(_ nums1: inout [Int], _ m: Int, _ nums2: [Int], _ n: Int) {
// ๊ฐ ๋ฐฐ์ด์ ๋์ ๊ฐ๋ฆฌํค๋ p1๊ณผ p2๋ฅผ ์ค์ ํฉ๋๋ค.
var p1 = m - 1
var p2 = n - 1
// p๋ฅผ ๋ฐฐ์ด์ ํตํด ๋ค๋ก ์ด๋ํ๋ฉด์, ๋งค๋ฒ p1 ๋๋ p2๊ฐ ๊ฐ๋ฆฌํค๋ ๋ ์์ ๊ฐ์ ์์ฑํฉ๋๋ค.
for p in stride(from: m + n - 1, through: 0, by: -1) {
if p2 < 0 {
break
}
if p1 >= 0 && nums1[p1] > nums2[p2] {
nums1[p] = nums1[p1]
p1 -= 1
} else {
nums1[p] = nums2[p2]
p2 -= 1
}
}
}
}
Complexity Analysis
- Time complexity:
O(n + m)
- Same as Approach 2.
- Space complexity:
O(1)
- Unlike Approach 2, weโre not using an extra array.
Proof(optional)
์ด ์ฃผ์ฅ์ ๋ํด ์กฐ๊ธ ํ์์ ์ผ ์๋ ์์ต๋๋ค.
์ ๋ง ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ํ๋์?
์ด๋ ๊ฒ ๋๋ดํ ์ฃผ์ฅ์ ํ๋ ๊ฒ์ด ์์ ํ๊ฐ์?
์ด ๋ฐฉ์์ผ๋ก, `nums1`์ ์ฒ์ `m`๊ฐ ๊ฐ์ ๋ฎ์ด์ฐ๊ธฐ ์์ํ๋ฉด, ๊ฐ๊ฐ์ ์ด๋ฏธ ์ ์์น์ ์จ ๋์์ ๊ฒ์ ๋๋ค
์ด๋ฐ ๋ฐฉ์์ผ๋ก ์ฐ๋ฆฌ๋ ์ถ๊ฐ ๊ณต๊ฐ์ ์์จ ์ ์์ต๋๋ค.
ํ๋ฅญํ ์ง๋ฌธ์
๋๋ค!
๊ทธ๋ ๋ค๋ฉด ์ ์ด ๋ฐฉ๋ฒ์ด ์๋ํ ๊น์?
์ด๋ฅผ ์ฆ๋ช
ํ๊ธฐ ์ํด, p
๊ฐ nums1
์์ p1
์ด ์์ง ์ฝ์ง ์์ ๊ฐ์ ๋ฎ์ด์ฐ์ง ์๋ ๊ฒ์ ํ์คํ ํด์ผ ํฉ๋๋ค.
์กฐ์ธ :์ฆ๋ช ์ ๊ฒ์ ๋จน๊ณ ์๋์?
๋ง์ ์ํํธ์จ์ด ์์ง๋์ด๋ค์ด ๊ทธ๋ ์ต๋๋ค.
์ข์ ์ฆ๋ช ์ ๊ฐ๋จํ ๊ฐ๊ฐ์ ๋ ผ๋ฆฌ์ ์ฃผ์ฅ๋ค์ด ๋ค์ ์ฃผ์ฅ ์์ ๊ตฌ์ถ๋๋ ๊ฒ์ ๋๋ค.
์ด๋ฐ ๋ฐฉ์์ผ๋ก, ์ฐ๋ฆฌ๋ "๋ช ๋ฐฑํ" ์ง์ ๋ก๋ถํฐ ์์ํ์ฌ ์ฆ๋ช ํ๊ณ ์ ํ๋ ๊ฒ์ ์ด๋ฃฐ ์ ์์ต๋๋ค.
๊ฐ ์ง์ ์ ํ๋์ฉ ์ฝ์ผ๋ฉฐ, ๋ค์์ผ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ๊ฐ๊ฐ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ด๊ธฐํ ์
p
๋p1
๋ณด๋คn
๋งํผ ์์ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.(๋ค๋ฅธ ๋ง๋ก,p1 + n = p
์ ๋๋ค.) - ๋ํ, ์ด ์๊ณ ๋ฆฌ์ฆ์ด ์ํํ๋
p
์ ๋ฐ๋ณต ๋์,p
๋ ํญ์1
๋งํผ ๊ฐ์ํ๊ณ ,p1
๋๋p2
์ค ํ๋๊ฐ1
๋งํผ ๊ฐ์ํ๋ค๋ ๊ฒ๋ ์๊ณ ์์ต๋๋ค. -
p1
์ด ๊ฐ์ํ ๋,p
์p1
์ฌ์ด์ ๊ฐ๊ฒฉ์ ๋์ผํ๊ฒ ์ ์ง๋๋ฏ๋ก, ๊ทธ ๊ฒฝ์ฐ์ โ์ถ์(overtake)โ์ด ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ ์ถ๋ก ํ ์ ์์ต๋๋ค. - ํ์ง๋ง
p2
๊ฐ ๊ฐ์ํ ๋๋,p
๋ ์์ง์ด์ง๋งp1
์ ๊ทธ๋ ์ง ์์ผ๋ฏ๋ก,p
์p1
์ฌ์ด์ ๊ฐ๊ฒฉ์ด1
๋งํผ ์ค์ด๋ ๊ฐ๋ ๊ฒ์ ์ถ๋ก ํ ์ ์์ต๋๋ค. - ๊ทธ๋ฆฌ๊ณ ์ด๋ก๋ถํฐ,
p2
๊ฐ ๊ฐ์ํ ์ ์๋ ์ต๋ ํ์๋n
๋ฒ์์ ์ถ๋ก ํ ์ ์์ต๋๋ค. ๋ค์ ๋งํด,p
์p1
์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ต๋n
๋งํผ1
์ฉ ์ค์ด๋ค ์ ์์ต๋๋ค. - ๊ฒฐ๋ก ์ ์ผ๋ก, ๊ทธ๋ค์ด ์ฒ์์
n
๋งํผ ๋จ์ด์ ธ ์์๊ธฐ ๋๋ฌธ์ ์ถ์์ด ์ผ์ด๋ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณp = p1
์ผ ๋, ๊ฐ๊ฒฉ์n
๋ฒ ์ค์ด๋ค์ด์ผ ํฉ๋๋ค. ์ด๋nums2
์ ๋ชจ๋ ๊ฒ์ด ๋ณํฉ๋์์ผ๋ฏ๋ก ๋ ์ด์ ํ ์ผ์ด ์์์ ์๋ฏธํฉ๋๋ค.