Skip to content

[Leetcode] 268. Missing Number โ€‹

Problem โ€‹

๋ฌธ์ œ๋งํฌ

nums ์ˆซ์ž ๋ฐฐ์—ด์ด ์กด์žฌํ•˜๊ณ , 0~n๊นŒ์ง€์˜ ์ˆซ์ž๋ฅผ ์˜ค์ง ํ•œ๊ฐœ์”ฉ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. ๋ฐฐ์—ด์—์„œ ๋น ์ง„ ์ˆซ์ž๋ฅผ ๊ตฌํ•˜์—ฌ๋ผ.

๋งŒ์•ฝ ๋น ์ง„ ์ˆซ์ž๊ฐ€ ์—†๋‹ค๋ฉด ๋งˆ์ง€๋ง‰ ๊ฐ’์ด ๋น ์ง„๊ฒƒ์„ ๊ณ ๋ คํ•˜์ž.

Solution โ€‹

๋ฐ˜๋ณต๋ฌธ, Binary Search

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.

nums๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค์Œ ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•ด์„œ ๋ฐฐ์—ด์˜ ์ˆœ์„œ๋Œ€๋กœ ์ธ๋ฑ์Šค(i)์™€ ๊ฐ’(nums[i])์„ ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด์ง„ํƒ์ƒ‰์„ ์ด์šฉํ•ด์„œ ์ธ๋ฑ์Šค(i)์™€ ๊ฐ’(nums[i])์„ ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•

๋‘ ๋ฐฉ๋ฒ•์—์„œ ๋‹ต์„ ์กฐ๊ฑด์€ ๊ฐ™์ง€๋งŒ ์ธ๋ฑ์Šค๋ฅผ ์กฐ๊ฑดํ•˜๋Š” ๋ฐฉ์‹์€ ๋‹ค๋ฅด๋‹ค.

์‹คํ–‰ ๋ฐฉ๋ฒ•๋น…์˜ค
๋ฐ˜๋ณต๋ฌธ์ธ๋ฑ์Šค ์ˆœ์„œ๋Œ€๋กœO(n)
์ด์ง„ํƒ์ƒ‰์ฐพ์„ ๋ฒ”์œ„๋ฅผ ์ค„์ž„O(log n)

์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๊ณ  ๋‘ ๋กœ์ง์˜ ์†๋„๋ฅผ ๋น„๊ตํ•ด๋ณด์ž.

๋ฐ˜๋ณต๋ฌธ ์ฝ”๋“œ โ€‹

  1. nums์„ ์ •๋ ฌํ•ด์ค€๋‹ค.
  2. ์ •๋ ฌํ•œ๋‹ค๋ฉด nums์˜ ๊ฐ’์€ ํ•ด๋‹น ์ธ๋ฑ์Šค์™€ ๊ฐ’์ด ๊ฐ™์•„์•ผํ•œ๋‹ค. ๋งŒ์•ฝ ๋‹ค๋ฅด๋‹ค๋ฉด ์ด์ „ ์ธ๋ฑ์Šค์—์„œ ์–ด๋–ค ๊ฐ’์ด ๋น ์ง„๊ฒƒ์ด๋‹ค.
  3. ์ธ๋ฑ์Šค์™€ ๊ฐ’์„ ๋น„๊ตํ•˜๋ฉด์„œ ๊ฐ’๊ณผ ํ‹€๋ฆฐ ๊ณณ์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์ธ๋ฑ์Šค๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ , ๋น ์ง„ ๊ฐ’์ด ์—†๋‹ค๋ฉด ๋งˆ์ง€๋ง‰ ์š”์†Œ๊ฐ€ ๋น ์ง„๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.
ts
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
}

์ด์ง„ํƒ์ƒ‰ โ€‹

  1. ์ด์ง„ํƒ์ƒ‰ ์‹คํ–‰ ์กฐ๊ฑด์˜ nums ๋ฐฐ์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์ค€๋‹ค. (๊ฐ’๊ณผ ํ•ด๋‹น ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ™์€ ๋ฐฐ์—ด์ด ์™„์„ฑ)
  2. left, right๋ฅผ ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ, ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋กœ ์„ค์ •ํ•ด์ค€๋‹ค. left์™€ right๋Š” ํƒ์ƒ‰ ๋ฒ”์œ„์ด๋‹ค.
  3. ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•ด์„œ ๋ฒ”์œ„๊ฐ€ **ํ•˜๋‚˜์˜ ์š”์†Œ๋กœ ์ขํ˜€์งˆ๋•Œ๊นŒ์ง€์˜ ์กฐ๊ฑด(ํƒ€๊ฒŸ)**์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.
  4. ๋ฒ”์œ„๋ฅผ ๋ฐ˜์œผ๋กœ ์ค„์—ฌ๊ฐ€๋ฉด์„œ ํƒ์ƒ‰ํ•˜๋Š”๊ฒƒ์ด ์ด์ง„ ํƒ์ƒ‰์˜ ์›๋ฆฌ์ด๋‹ค. ์ด ์›๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ ์–‘์ชฝ ์ธ๋ฑ์Šค๋ฅผ ์ค‘๊ฐ„ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.
  5. ์ค‘๊ฐ„๊ฐ’(mid)๊ณผ ์ค‘๊ฐ„๊ฐ’์˜ ๊ฐ’(nums[mid])๊ฐ€ ๊ฐ™์€์ง€ ํ™•์ธํ•œ๋‹ค.
    • ๋งŒ์•ฝ ๊ฐ™๋‹ค๋ฉด : ์ด์ „ ์ธ๋ฑ์Šค์—์„œ ๋น ์ง„ ๊ฐ’์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
    • ํ‹€๋ฆฌ๋‹ค๋ฉด : ์ด์ „์— ์–ด๋–ค ๊ฐ’์ด ๋น ์ง„ ๊ฒƒ์„ ์˜๋ฏธ
  6. ๊ฐ™์„ ๊ฒฝ์šฐ left์˜ ๋ฒ”์œ„๋ฅผ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค. (mid + 1), ํ‹€๋ฆฐ๊ฒฝ์šฐ ์ด์ „ ์ธ๋ฑ์Šค์—์„œ ํƒ€๊ฒŸ์„ ์ฐพ์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— right ๋ฒ”์œ„๋ฅผ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค (mid -1)
    • mid์˜ + 1์„ ํ•ด์ค€ ์ด์œ  : mid๋Š” ์ด๋ฏธ ํ™•์ธํ•œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ์š”์†Œ๋ถ€ํ„ฐ ํ™•์ธ. ๊ทธ๋Ÿฌ๋ฉด left๋Š” ์ธ๋ฑ์Šค์™€ ๊ฐ’์ด ํ‹€๋ฆฐ๊ฐ’์„ ์ตœ์ข…์ ์œผ๋กœ ๊ฐ€๋ฅดํ‚จ๋‹ค.
    • mid์˜ - 1์„ ํ•ด์ค€ ์ด์œ  : ์œ„์™€ ๊ฐ™์ธ ์ด์œ (mid๋Š” ์ด๋ฏธ ํ™•์ธํ•œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ ์š”์†Œ๋ถ€ํ„ฐ ํ™•์ธ)์ด๋ฉด์„œ ๋‚ด๊ฐ€ ์ฐพ๋Š” ํƒ€๊ฒŸ์ผ ์ˆ˜ ์žˆ๋‹ค.
  7. left์™€ right๋Š” ํ•˜๋‚˜์˜ ๊ฐ’์„ ๊ฐ€๋ฅดํ‚ค๊ฒŒ๋œ๋‹ค. ์ด๊ฒƒ์ด ์ตœ์ดˆ๋กœ ์ธ๋ฑ์Šค์™€ ๊ฐ’์ด ํ‹€๋ฆฐ ์š”์†Œ์ž…๋‹ˆ๋‹ค.
ts
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์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ์ผ€์ด์Šค๋Š” ์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰ํ–ˆ์„ ๋•Œ ์ตœ์•…์˜ ์ผ€์ด์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋‹ค์Œ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‹คํ–‰ํ–ˆ์„๋•Œ ์ž…๋‹ˆ๋‹ค.

ts
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))
}
bash
bound binarySearch :: 99999998
bound binarySearch: 1.427ms
bound forLoop :: 99999998
bound forLoop: 141.067ms

์†๋„๋ฅผ ๋ณด๋ฉด ์ด์ง„ํƒ์ƒ‰์ด ๋งค์šฐ ๋น ๋ฅธ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ๋น…์˜ค๊ณ„์‚ฐ๋ฒ•์œผ๋กœ ์†๋„ ํ–ฅ์ƒ ํญ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ทธ๋ž˜ํ”„์ž…๋‹ˆ๋‹ค.

๋น…์˜ค