[Leetcode] 268. Missing Number โ
Problem โ
nums
์ซ์ ๋ฐฐ์ด์ด ์กด์ฌํ๊ณ , 0~n๊น์ง์ ์ซ์๋ฅผ ์ค์ง ํ๊ฐ์ฉ ํฌํจํ๊ณ ์๋ค. ๋ฐฐ์ด์์ ๋น ์ง ์ซ์๋ฅผ ๊ตฌํ์ฌ๋ผ.
๋ง์ฝ ๋น ์ง ์ซ์๊ฐ ์๋ค๋ฉด ๋ง์ง๋ง ๊ฐ์ด ๋น ์ง๊ฒ์ ๊ณ ๋ คํ์.
Solution โ
๋ฐ๋ณต๋ฌธ, Binary Search
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
nums
๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค์ ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด์ ๋ฐฐ์ด์ ์์๋๋ก ์ธ๋ฑ์ค(i)์ ๊ฐ(nums[i])์ ๋น๊ตํ๋ ๋ฐฉ๋ฒ๊ณผ ์ด์งํ์์ ์ด์ฉํด์ ์ธ๋ฑ์ค(i)์ ๊ฐ(nums[i])์ ๋น๊ตํ๋ ๋ฐฉ๋ฒ
๋ ๋ฐฉ๋ฒ์์ ๋ต์ ์กฐ๊ฑด์ ๊ฐ์ง๋ง ์ธ๋ฑ์ค๋ฅผ ์กฐ๊ฑดํ๋ ๋ฐฉ์์ ๋ค๋ฅด๋ค.
์คํ ๋ฐฉ๋ฒ | ๋น ์ค | |
---|---|---|
๋ฐ๋ณต๋ฌธ | ์ธ๋ฑ์ค ์์๋๋ก | O(n) |
์ด์งํ์ | ์ฐพ์ ๋ฒ์๋ฅผ ์ค์ | O(log n) |
์ฝ๋๋ฅผ ๊ตฌํํด๋ณด๊ณ ๋ ๋ก์ง์ ์๋๋ฅผ ๋น๊ตํด๋ณด์.
๋ฐ๋ณต๋ฌธ ์ฝ๋ โ
nums
์ ์ ๋ ฌํด์ค๋ค.- ์ ๋ ฌํ๋ค๋ฉด
nums
์ ๊ฐ์ ํด๋น ์ธ๋ฑ์ค์ ๊ฐ์ด ๊ฐ์์ผํ๋ค. ๋ง์ฝ ๋ค๋ฅด๋ค๋ฉด ์ด์ ์ธ๋ฑ์ค์์ ์ด๋ค ๊ฐ์ด ๋น ์ง๊ฒ์ด๋ค. - ์ธ๋ฑ์ค์ ๊ฐ์ ๋น๊ตํ๋ฉด์ ๊ฐ๊ณผ ํ๋ฆฐ ๊ณณ์ด ์๋ค๋ฉด ํด๋น ์ธ๋ฑ์ค๋ฅผ ๋ฆฌํดํ๊ณ , ๋น ์ง ๊ฐ์ด ์๋ค๋ฉด ๋ง์ง๋ง ์์๊ฐ ๋น ์ง๊ฒ์ผ๋ก ์๊ฐํ๊ณ ๋ง์ง๋ง ๊ฐ์ ๋ฆฌํดํ๋ค.
function forLoop(nums: number[]): number {
nums.sort((a, b) => a - b)
for (let i = 0; i < nums.length; i++) {
if (i !== nums[i]) return i
}
return nums.length
}
์ด์งํ์ โ
- ์ด์งํ์ ์คํ ์กฐ๊ฑด์
nums
๋ฐฐ์ด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํด์ค๋ค. (๊ฐ๊ณผ ํด๋น ์ธ๋ฑ์ค๊ฐ ๊ฐ์ ๋ฐฐ์ด์ด ์์ฑ) - left, right๋ฅผ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ, ๋ง์ง๋ง ์ธ๋ฑ์ค๋ก ์ค์ ํด์ค๋ค. left์ right๋ ํ์ ๋ฒ์์ด๋ค.
- ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด์ ๋ฒ์๊ฐ **ํ๋์ ์์๋ก ์ขํ์ง๋๊น์ง์ ์กฐ๊ฑด(ํ๊ฒ)**์ ์ถ๊ฐํด์ค๋ค.
- ๋ฒ์๋ฅผ ๋ฐ์ผ๋ก ์ค์ฌ๊ฐ๋ฉด์ ํ์ํ๋๊ฒ์ด ์ด์ง ํ์์ ์๋ฆฌ์ด๋ค. ์ด ์๋ฆฌ๋ฅผ ์ด์ฉํด์ ์์ชฝ ์ธ๋ฑ์ค๋ฅผ ์ค๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋๋ค.
- ์ค๊ฐ๊ฐ(mid)๊ณผ ์ค๊ฐ๊ฐ์ ๊ฐ(nums[mid])๊ฐ ๊ฐ์์ง ํ์ธํ๋ค.
- ๋ง์ฝ ๊ฐ๋ค๋ฉด : ์ด์ ์ธ๋ฑ์ค์์ ๋น ์ง ๊ฐ์ด ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ํ๋ฆฌ๋ค๋ฉด : ์ด์ ์ ์ด๋ค ๊ฐ์ด ๋น ์ง ๊ฒ์ ์๋ฏธ
- ๊ฐ์ ๊ฒฝ์ฐ left์ ๋ฒ์๋ฅผ ๋ณ๊ฒฝํด์ค๋ค. (mid + 1), ํ๋ฆฐ๊ฒฝ์ฐ ์ด์ ์ธ๋ฑ์ค์์ ํ๊ฒ์ ์ฐพ์์ผํ๊ธฐ ๋๋ฌธ์ right ๋ฒ์๋ฅผ ๋ณ๊ฒฝํด์ค๋ค (mid -1)
mid์ + 1
์ ํด์ค ์ด์ : mid๋ ์ด๋ฏธ ํ์ธํ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ค์ ์์๋ถํฐ ํ์ธ. ๊ทธ๋ฌ๋ฉด left๋ ์ธ๋ฑ์ค์ ๊ฐ์ด ํ๋ฆฐ๊ฐ์ ์ต์ข ์ ์ผ๋ก ๊ฐ๋ฅดํจ๋ค.mid์ - 1
์ ํด์ค ์ด์ : ์์ ๊ฐ์ธ ์ด์ (mid๋ ์ด๋ฏธ ํ์ธํ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ด์ ์์๋ถํฐ ํ์ธ)์ด๋ฉด์ ๋ด๊ฐ ์ฐพ๋ ํ๊ฒ์ผ ์ ์๋ค.
- left์ right๋ ํ๋์ ๊ฐ์ ๊ฐ๋ฅดํค๊ฒ๋๋ค. ์ด๊ฒ์ด ์ต์ด๋ก ์ธ๋ฑ์ค์ ๊ฐ์ด ํ๋ฆฐ ์์์ ๋๋ค.
function binarySearch(nums: number[]): number {
nums.sort((a, b) => a - b)
let [left, right] = [0, nums.length - 1]
while (left < right) {
const mid = Math.floor((left + right) / 2)
if (mid === nums[mid]) left = mid + 1
else right = mid - 1
}
return left === nums[left] ? left + 1 : left
}
๋น๊ต โ
๋ฐฐ์ด์ ์ฌ์ด์ฆ๋ฅผ 100,000,000๋ก ๋๋ฆฌ๊ณ ๋ง์ง๋ง ์ธ๋ฑ์ค ๊ทผ๋ฐฉ์ ๋บ input
์ ๋ง๋ญ๋๋ค. ์ด ์ผ์ด์ค๋ ์์๋๋ก ํ์ํ์ ๋ ์ต์
์ ์ผ์ด์ค๋ฅผ ๋ง๋ค์์ต๋๋ค. ๊ทธ๋ฐ๋ค์ ์คํ ์๊ฐ์ ์ถ๋ ฅํ๋ ํจ์๋ฅผ ์์ฑํ์ฌ ์คํํ์๋ ์
๋๋ค.
function play () {
const size = 100_000_000
const input = Array.from(Array(size), (_,i) => i)
input.splice(size-2,1)
const timer = (fn: Function): void => {
console.time(fn.name)
console.log(`${fn.name} :: ${fn()}`)
console.timeEnd(fn.name)
}
timer(binarySearch.bind(binarySearch, input))
timer(forLoop.bind(forLoop, input))
}
bound binarySearch :: 99999998
bound binarySearch: 1.427ms
bound forLoop :: 99999998
bound forLoop: 141.067ms
์๋๋ฅผ ๋ณด๋ฉด ์ด์งํ์์ด ๋งค์ฐ ๋น ๋ฅธ๊ฒ์ ํ์ธ ํ ์ ์์ต๋๋ค.
์๋๋ ๋น ์ค๊ณ์ฐ๋ฒ์ผ๋ก ์๋ ํฅ์ ํญ์ ๋ณด์ฌ์ฃผ๋ ๊ทธ๋ํ์ ๋๋ค.