๐ [LeetCode] 1089.Duplicate Zeros
- Difficulty: Easy
- Topic: Array, Two Pointers
๋ฌธ์ ๋ ๋ฐฐ์ด์ ์ ์๋ฆฌ์์ ์์ ํ๋๋ก ์๊ตฌํฉ๋๋ค.
์ ์๋ฆฌ ์์ ์ด ์ ์ฝ ์กฐ๊ฑด์ด ์๋๋ผ๋ฉด, ์๋ณธ ๋ฐฐ์ด์์ ๋์ ๋ฐฐ์ด๋ก ์์๋ฅผ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ ๊ฒ์
๋๋ค.
0์ ๋ ๋ฒ ๋ณต์ฌํ ๊ฒ์ ์ฃผ๋ชฉํ์ธ์.
var s = 0
var d = 0
let N = source.count // ์ฌ๊ธฐ์ 'source'๋ Int ํ์
์ ๋ฐฐ์ด์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
var destination = [Int]()
// ๋ชฉ์ ์ง ๋ฐฐ์ด์ด ๊ฐ๋ ์ฐฐ ๋๊น์ง ๋ณต์ฌ๊ฐ ์ํ๋ฉ๋๋ค.
while s < N {
if source[s] == 0 {
// 0์ ๋ ๋ฒ ๋ณต์ฌํฉ๋๋ค.
destination.append(0)
d += 1
destination.append(0)
} else {
destination.append(source[s])
}
d += 1
s += 1
}
๋ฌธ์ ์ค๋ช
์๋ ์ ๋ฐฐ์ด์ ํ์ฅํ์ง ์๊ณ ์๋ ๋ฐฐ์ด์ ๊ธธ์ด๋ก๋ง ์๋ฅธ๋ค๊ณ ๋ ์ธ๊ธ๋์ด ์์ต๋๋ค.
์ด๋ ๋ฐฐ์ด์ ๋์์ ๋ช๋ช ์์๋ฅผ ๋ฒ๋ ค์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
์ด๋ฌํ ์์๋ค์ ์๋ก์ด ์ธ๋ฑ์ค๊ฐ ์๋ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ๋์ด์๋ ์์๋ค์
๋๋ค.
์ฐ๋ฆฌ์๊ฒ ์ฃผ์ด์ง ๋ฌธ์ ์ ์ฝ ์ฌํญ์ ๋ํด ๋ค์ ์๊ฐํด ๋ด
์๋ค.
์ถ๊ฐ ๊ณต๊ฐ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์, ์ฐ๋ฆฌ์ ์๋ณธ ๋ฐฐ์ด๊ณผ ๋์ ๋ฐฐ์ด์ ๋ณธ์ง์ ์ผ๋ก ๋์ผํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๋จ์ํ ์๋ณธ์ ๋์ ๋ฐฐ์ด๋ก ๊ทธ๋๋ก ๋ณต์ฌํ ์ ์์ต๋๋ค.
๊ทธ๋ ๊ฒ ํ๋ฉด ๋ช๋ช ์์๋ฅผ ์์ด๋ฒ๋ฆด ๊ฒ์
๋๋ค.
์๋ํ๋ฉด, ์ฐ๋ฆฌ๋ ๋ฐฐ์ด์ ๋ฎ์ด์ฐ๊ฒ ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด๋ฅผ ์ผ๋์ ๋๊ณ ์๋ ๊ฒ๊ทผ ๋ฐฉ์์์๋ ๋ฐฐ์ด์ ๋ ๋ถ๋ถ์ ๋ณต์ฌ๋ฅผ ์์ํฉ๋๋ค.
Approach 1: Two pass, O(1) space
Intuition(์ง๊ด)
๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด์ ๋์์ ๋ฒ๋ ค์ง ์์์ ์๋ฅผ ์๋ค๋ฉด, ๋๋จธ์ง๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ป๊ฒ ๋ฐฐ์ด์ ๋์์ ๋ฒ๋ ค์ง ์์์ ์๋ฅผ ์์๋ผ ์ ์์๊น์?
๊ทธ ์๋ ๋ฐฐ์ด์ ์ถ๊ฐ๋ ์ฌ๋ถ์ 0์ ์์ ๊ฐ์ ๊ฒ์
๋๋ค.
์ฌ๋ถ์ 0์ ๋ฐฐ์ด์ ๋์์ ์์ ํ๋๋ฅผ ๋ฐ์ด๋ด๋ฉด์ ์์ ์ ์ํ ๊ณต๊ฐ์ ๋ง๋ญ๋๋ค.
์ผ๋จ ์ฐ๋ฆฌ๊ฐ ์๋ ๋ฐฐ์ด์์ ์ต์ข
๋ฐฐ์ด์ ์ผ๋ถ๊ฐ ๋ ์์์ ์๋ฅผ ์๊ฒ ๋๋ฉด, ์ฐ๋ฆฌ๋ ๋์์๋ถํฐ ๋ณต์ฌํ๊ธฐ ์์ํ ์ ์์ต๋๋ค.
๋์์๋ถํฐ ๋ณต์ฌํ๋ ๊ฒ์, ๋ง์ง๋ง ๋ช ๊ฐ์ ๋ถํ์ํ ์์๋ค์ ๋ฎ์ด์ธ ์ ์๊ธฐ ๋๋ฌธ์, ์ด๋ค ์์๋ ์์ด๋ฒ๋ฆฌ์ง ์๊ฒ ํด์ค๋๋ค.
Algorithm
1๏ธโฃ. ์ค๋ณต๋ ์ ๋ก์ ์๋ฅผ ์ฐพ์ต๋๋ค. ์ด๋ฅผ possible_dups
๋ผ๊ณ ํฉ์๋ค.
์ต์ข
๋ฐฐ์ด์ ์ผ๋ถ๊ฐ ๋์ง ์์ ์๋ฆฐ ์ ๋ก๋ค์ ์ธ์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
๋ฒ๋ ค์ง ์ ๋ก๋ค์ ์ต์ข
๋ฐฐ์ด์ ์ผ๋ถ๊ฐ ๋์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
possible_dups
์ ๊ฐ์๋ ์๋ ๋ฐฐ์ด์์ ์๋ฆด ์์์ ์๋ฅผ ์๋ ค์ค ๊ฒ์
๋๋ค.
๋ฐ๋ผ์ ์ด๋์์ ์์๋ , length_ - possible_dups
๋ ์ต์ข
๋ฐฐ์ด์ ํฌํจ๋ ์์์ ์์
๋๋ค.
์ฐธ๊ณ : ์์ ๋ค์ด์ด๊ทธ๋จ์์๋ ์ดํด๋ฅผ ๋๊ธฐ ์ํด ์๋ณธ ๋ฐฐ์ด๊ณผ ๋์ ๋ฐฐ์ด์ ๋ณด์ฌ์ค๋๋ค
์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ฐ์ฐ๋ค์ ์ค์ง ํ๋์ ๋ฐฐ์ด์์๋ง ์ํํ ๊ฒ์
๋๋ค.
2๏ธโฃ. ๋จ์ ์์๋ค์ ๊ฒฝ๊ณ์ ์๋ ์ ๋ก์ ๋ํ ์์ง ์ผ์ด์ค๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
์ด ๋ฌธ์ ์ ์์ง ์ผ์ด์ค์ ๋ํด ์ด์ผ๊ธฐํด ๋ด
์๋ค.
๋จ์ ๋ฐฐ์ด์์ ์ ๋ก๋ฅผ ๋ณต์ ํ ๋๋ ํน๋ณํ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
์ด ์ฃผ์๋ ๊ฒฝ๊ณ์ ๋์ธ Zero
์ ๋ํด์ ์ทจํด์ ธ์ผ ํฉ๋๋ค.
์๋ํ๋ฉด, ์ด ์ ๋ก๋ ๊ฐ๋ฅํ ์ค๋ณต์ผ๋ก ๊ฐ์ฃผ๋๊ฑฐ๋, ๊ทธ๊ฒ์ ๋ณต์ ๋ฅผ ์์ฉํ ๊ณต๊ฐ์ด ์์ ๋ ๋จ์ ๋ถ๋ถ์ ํฌํจ๋ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ง์ฝ ๊ทธ๊ฒ์ด possible_dups
์ ์ผ๋ถ๋ผ๋ฉด ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ณต์ ํ๊ณ ์ถ์ ๊ฒ์ด๊ณ , ๊ทธ๋ ์ง ์๋ค๋ฉด ๋ณต์ ํ์ง ์์ ๊ฒ์
๋๋ค.
์์ง ์ผ์ด์ค์ ์๋ - [8,4,5,0,0,0,0,7] ์ ๋๋ค.
์ด ๋ฐฐ์ด์์ ์ฒซ ๋ฒ์งธ์ ๋ ๋ฒ์งธ๋ก ์ ๋ก์ ์ค๋ณต์ ์์ฉํ ๊ณต๊ฐ์ด ์์ต๋๋ค.
ํ์ง๋ง ์ธ๋ฒ์งธ ์ ๋ก์ ์ค๋ณต์ ์ํ ์ถฉ๋ถํ ๊ณต๊ฐ์ด ์์ต๋๋ค.
๋ฐ๋ผ์ ๋ณต์ฌํ ๋ ์ธ ๋ฒ์งธ ์ ๋ก์ ๋ํด์ ๋ ๋ฒ ๋ณต์ฌํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
๊ฒฐ๊ณผ = [8,4,5,0,`0`,0,`0`,0]
3๏ธโฃ. ๋ฐฐ์ด์ ๋์์๋ถํฐ ์ํํ์ฌ, 0์ด ์๋ ์์๋ ํ ๋ฒ, 0 ์์๋ ๋ ๋ฒ ๋ณต์ฌํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ถํ์ํ ์์๋ค์ ๋ฒ๋ฆฐ๋ค๊ณ ํ ๋, ์ด๋ ๋จ์ํ ๋ถํ์ํ ์์๋ค์ ์ผ์ชฝ์์ ์์ํ์ฌ ์๋ก์ด ๊ฐ๋ค๋ก ๊ทธ๊ฒ๋ค์ ๋ฎ์ด์ฐ๊ณ , ๊ฒฐ๊ตญ ๋จ์ ์์๋ค์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋์์ผ ๋ฐฐ์ด ์์ ์ค๋ณต๋ ์์๋ค์ ์ํ ๊ณต๊ฐ์ ๋ง๋ค์ด๋ธ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
class Solution {
func duplicateZeros(_ arr: inout [Int]) {
var possibleDups = 0
let length_ = arr.count - 1
// ๋ณต์ ํ 0์ ๊ฐ์๋ฅผ ์ฐพ์ต๋๋ค.
// ์๋ ๋ฐฐ์ด์ ๋ง์ง๋ง ์์๋ฅผ ๋์ด์๋ฉด ์ค์งํฉ๋๋ค.
// ์์ ๋ ๋ฐฐ์ด์ ์ผ๋ถ๊ฐ ๋ ๋ง์ง๋ง ์์๋ฅผ ๋์ด์๋ฉด ์ค์งํฉ๋๋ค.
for left in 0...(length_ - possibleDups) {
// 0 ์ซ์ ์ธ๊ธฐ
if arr[left] == 0 {
// Edge case: ์ด 0์ ๋ณต์ ํ ์ ์์ต๋๋ค. ๋ ์ด์ ๊ณต๊ฐ์ด ์์ต๋๋ค.
// ์ผ์ชฝ์ ํฌํจ๋ ์ ์๋ ๋ง์ง๋ง ์์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ต๋๋ค.
if left == length_ - possibleDups {
// ์ด 0์ ๊ฒฝ์ฐ ์ค๋ณต ์์ด ๋ณต์ฌํฉ๋๋ค.
arr[length_] = 0
break
}
possibleDups += 1
}
}
// ์ ๋ฐฐ์ด์ ์ผ๋ถ๊ฐ ๋ ๋ง์ง๋ง ์์๋ถํฐ ๊ฑฐ๊พธ๋ก ์์ํฉ๋๋ค.
var last = length_ - possibleDups
// 0์ ๋ ๋ฒ ๋ณต์ฌํ๊ณ 0์ด ์๋ ๊ฒ์ ํ ๋ฒ ๋ณต์ฌํฉ๋๋ค.
while last >= 0 {
if arr[last] == 0 {
arr[last + possibleDups] = 0
possibleDups -= 1
arr[last + possibleDups] = 0
} else {
arr[last + possibleDups] = arr[last]
}
last -= 1
}
}
}
Complexity Analysis
- ์๊ฐ ๋ณต์ก๋(Time Complexity):
O(N)
, ์ฌ๊ธฐ์N
์ ๋ฐฐ์ด์ ์์ ์์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฐฐ์ด์ ๋ ๋ฒ ์ํํ๋๋ฐ, ํ๋๋possible_dups
์ ์๋ฅผ ์ฐพ๊ธฐ ์ํด, ๋ค๋ฅธ ํ๋๋ ์์๋ค์ ๋ณต์ฌํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ต์ ์ ๊ฒฝ์ฐ, ๋ฐฐ์ด์ zero๊ฐ ์ ๊ฑฐ๋ ์์ ๋ ๋ฐฐ์ด ์ ์ฒด๋ฅผ ์ํํ ์๋ ์์ต๋๋ค. - ๊ณต๊ฐ ๋ณต์ก๋(Space Complexity):
O(1)
, ์ฐ๋ฆฌ๋ ์ถ๊ฐ์ ์ธ ๊ณต๊ฐ์ ์ฌ์ฉํ์ง ์์ต๋๋ค.