[LeetCode]Two Sum

Icarus<Wing>ยท2024๋…„ 10์›” 9์ผ

https://leetcode.com/problems/two-sum/description/

๐Ÿ“œ๋ฌธ์ œ ํ•ด์„(feat.์˜์‹์˜ ํ๋ฆ„)

๋ฌธ์ œ: int ํƒ€์ž…์˜ nums์˜ ๋ฐฐ์—ด๊ณผ target์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, target์„ ๋งŒ์กฑํ•˜๋Š” ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค 2๊ฐœ๋ฅผ ๋ฆฌํ„ดํ•˜๋ผ.(๋‹จ, ๊ฐ™์€ ์›์†Œ๋ฅผ 2๋ฒˆ ์ด์ƒ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.)

๐Ÿšง์ œ์•ฝ ์กฐ๊ฑด

  1. 2 <= nums.length <= 10^4
    ๐Ÿ‘‰len(nums)์˜ ์ตœ๋Œ€๊ฐ€ 10^4์ด๋ฏ€๋กœ, O(N^2)=10^8์ด๋ผ ์ด์ค‘ for๋ฌธ์€ ๋ถˆ๊ฐ€ํ•˜๋ฏ€๋กœ O(nlogn), O(n), O(logn) ์ค‘์— ํ•˜๋‚˜ ์‚ฌ์šฉํ•  ๊ฒƒ

  2. (โญ์ค‘์š”) "Only one valid answer exists." ์ฆ‰, target์„ ๋งŒ์กฑํ•˜๋Š” ๋‹ค๋ฅธ ์ˆœ์„œ์Œ์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ
    ๐Ÿ‘‰ "return indices of the two numbers such that they add up to target." ๋ฌธ์ œ์— ์กฐ๊ฑด๋„ ํฌํ•จํ•˜๋Š”๋ฐ, ๋ฆฌํ„ด์€ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ‰ค! ๋‚ด๋ฑ‰๊ณ  ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๊ธฐ๋Šฅ(์ •ํ™•ํžˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๊ณณ์œผ๋กœ ๋Œ์•„๊ฐ)์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ


1) ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค 2๊ฐœ๋ฅผ ๋ฆฌํ„ดํ•˜๋ผ? -> ์•„ ์ด๊ฑฐ, ์กฐํ•ฉ์ด๊ตฌ๋‚˜. ์™œ๋ƒํ•˜๋ฉด nums์—์„œ 2๊ฐœ๋งŒ ์„ ํƒํ•ด์„œ target์„ ๋งŒ์กฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ
(์ฃผ์˜) ๊ทธ๋Ÿฐ๋ฐ, ๊ฒ€์ƒ‰ํ•ด๋ดค๋”๋‹ˆ ์กฐํ•ฉ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(2^N)์ด๋‹ˆ๊นŒ ์ด์ค‘ for๋ฌธ๋ณด๋‹ค ๋†’๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ ๋ถˆ๊ฐ€

2) O(nlogn)์ด ๊ฑธ๋ฆฌ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๋ญ๊ฐ€ ์žˆ์„๊นŒ? -> ํŒŒ์ด์ฌ์˜ sort ๋ฉ”์„œ๋“œ(ํ€ต ์†ŒํŠธ๋ผ nlogn์ด ๊ฑธ๋ฆผ) ๊ทธ๋Ÿฌ๋‚˜, ์ธ๋ฑ์Šค๋งŒ ๋ฆฌํ„ดํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌํ•  ํ•„์š” x

3) O(n): dp๋ฐ–์— ์—†์Œ. ์ผ๋‹จ top-down ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด๋ณด์ž!

O(N^2)๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ์ด์ค‘ for๋ฌธ

โš™๏ธ์ฝ”๋“œ ์„ค๊ณ„

  1. ์ธ๋ฑ์Šค๋งŒ ๋ฆฌํ„ดํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋”•์…”๋„ˆ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.(dict.keys()๋ฅผ ์‚ฌ์šฉ)
  2. ๋งˆ์ง€๋ง‰์œผ๋กœ nums์˜ ์ธ๋ฑ์Šค๋“ค์„ ๋ฆฌํ„ด

๐Ÿ’ป์ฝ”๋“œ ๊ตฌํ˜„


class Solution(object):
    def twoSum(self, nums, target):
        # 1) Using nested loops takes O(N^2)
        ans = {} # in order to access indices
        start = 0
        for i in range(start, len(nums)):
            for j in range(start + 1, len(nums)): # to skip overlapped index i
                if nums[i] + nums[j] == target:
                    ans[i] = nums[i]
                    ans[j] = nums[j]
                    break
            start += 1 # if you can't find the answer, add 1 to i index
        return list(ans.keys())

์ œ์ถœ์€ ์„ฑ๊ณตํ–ˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ๋ถ„์„์„ ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์“ธ๋ฐ์—†๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์ˆ˜์ •ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.๐Ÿ‘‡


class Solution(object):
    def twoSum(self, nums, target):
        # 1) Using nested loops takes O(N^2)
        for i in range(len(nums)):
            for j in range(i + 1, len(nums)): # Use i index and Add 1 to avoid overlapping with i index
                if nums[i] + nums[j] == target:
                    return [i, j] # Utilize feature of return
  1. j์˜ start_index๋ฅผ ๋ฐ”๊นฅ ๋ฃจํ”„์™€ ๊ฒน์น˜์ง€ ์•Š๊ณ  i์˜ ๋ฐ”๋กœ ๋‹ค์Œ ์›์†Œ๋กœ ์ธ๋ฑ์‹ฑํ•˜๊ธฐ ์œ„ํ•ด i+1๋กœ ์„ค์ •ํ–ˆ๋‹ค.
  2. target์„ ๋งŒ์กฑํ•˜๋Š” ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค 2๊ฐœ๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ ์œ„ํ•ด return [i, j]๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๋ฐ˜ํ™˜ํ•˜์˜€๋‹ค.

๐Ÿค”์ด์ œ ๊ด€๊ฑด์€, ์ด์ค‘ for๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์˜ค์ง ํ•˜๋‚˜์˜ for๋ฌธ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”์‹œํ‚ฌ ์ง€๊ฐ€ ๋ฌธ์ œ๋‹ค.

๋ณด์ˆ˜(Complement)์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•๊ณผ ๊ทธ์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•์„ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ํ™œ์šฉํ•ด์„œ O(N)์œผ๋กœ ์ค„์ด์ž

๋„๋Œ€์ฒด ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋‹จ ํ•˜๋‚˜์˜ for๋ฌธ์œผ๋กœ ์ค„์—ฌ์•ผ ํ•˜๋Š”์ง€ 3์‹œ๊ฐ„ ์ด์ƒ ๊ณ ๋ฏผ์„ ํ–ˆ๋Š”๋ฐ๋„ ๋ชฐ๋ผ์„œ ํŒจ๋ฐฐ๋ฅผ ์ธ์ •ํ•˜๊ณ , ๊ฐ•์˜ ๋‚ด์šฉ์„ ๋ณธ ๋‹ค์Œ 3๋‹จ๊ณ„ ๋ถ„์„ ์ฐจ์›์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ’€์ด ๊ณผ์ •์„ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ, ๊ฐ•์˜๋Š” ์˜คํžˆ๋ ค O(2^N)์„ ๊ฐ€์ง€๋Š” ์กฐํ•ฉ ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋„์›€์ด ์•ˆ๋ฌ๋‹ค.

๋”ฐ๋ผ์„œ, ์šฐ์„  ๋ณด์ˆ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€, ๋”•์…”๋„ˆ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ณต๋ถ€ํ•œ ๋‹ค์Œ, ๋„๋Œ€์ฒด ๋ณด์ˆ˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์–ด๋–ป๊ฒŒ ๋”•์…”๋„ˆ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ํ™œ์šฉ์ด ๋ฌ๋Š”์ง€์— ๋Œ€ํ•ด ๋ถ„์„ํ•  ๊ฒƒ์ด๋‹ค.

๋ณด์ˆ˜(Complement)๋ž€?

์ปดํ“จํ„ฐ๋Š” 1๊ณผ 0์œผ๋กœ๋งŒ ๊ตฌ์„ฑ๋œ bit(binary digit)๋กœ ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š”๋ฐ AND, OR, ๊ทธ๋ฆฌ๊ณ  XOR ์—ฐ์‚ฐ์„ ํ•˜์—ฌ ๊ฒฐ๊ณผ๊ฐ’์„ ์‚ฐ์ถœํ•ด๋‚ธ๋‹ค.

  • ๐Ÿ“ข์‚ฌ์‹ค ํ˜„๋Œ€ ์ปดํ“จํ„ฐ๋Š” ๋บ„์…ˆ์„ ํฌํ•จํ•œ ๋”์šฑ ๋ณต์žกํ•œ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•œ๋ฐ, ๋ณด์ˆ˜์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ์‚ฐ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜์˜€๋‹ค.)

์ด ๊ณผ์ •์—์„œ ์Œ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๊ฑฐ๋‚˜, ์Œ์ˆ˜ ์—ฐ์‚ฐ์„ ํ•  ๋•Œ ๋ณด์ˆ˜๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ •์ˆ˜๋ฅผ ์Œ์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

2์ง„๋ฒ•์œผ๋กœ ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ, ๊ฐ€์žฅ ์™ผ์ชฝ๊ฐ’์ธ MSB(Most Significant Bit)์„ 1๋กœ ์„ค์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

์–‘์ˆ˜ + ์–‘์ˆ˜, ์Œ์ˆ˜ + ์Œ์ˆ˜์™€ ๊ฐ™์ด MSB๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ์—๋Š” ์—ฐ์‚ฐ์ด ์–ด๋ ต์ง€ ์•Š๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, MSB๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅผ ๊ฒฝ์šฐ์—๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ๋ฌด์—‡์„ ๋จผ์ € ์—ฐ์‚ฐ์„ ํ•ด์•ผํ•  ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ณด์ˆ˜๋ผ๋Š” ๊ฐœ๋…์ด๋‹ค.

๋ณด์ˆ˜๋ฅผ ํ†ตํ•ด ๋บ„์…ˆ์„ ๋ง์…ˆ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

์–ด๋–ค ์ˆ˜์˜ ๋ณด์ˆ˜: ์–ด๋–ค ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ๋ณด์ถฉ๋˜์–ด์•ผ ํ•˜๋Š” ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋Š”๋ฐ, ์ปดํ“จํ„ฐ๋Š” ๋บ„์…ˆ์„ ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋ง์…ˆ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ
๐Ÿ“ข์–ด๋ ต๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ๋ง๊ณ , m์— ๋Œ€ํ•œ n์˜ ๋ณด์ˆ˜๋Š” m์„ ๊ธฐ์ค€๊ฐ’์œผ๋กœ ํ•ด์„œ m = n + x, ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ "n์— ์–ด๋–ค ์ˆ˜๋ฅผ ๋”ํ•˜๋ฉด m์ด ๋ ๊นŒ์š”?" ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
๐Ÿ‘‰๊ทธ๋ž˜์„œ m = n + x => x = m - n => x = m + (-n)

์˜ˆ) 9 - 6 = 3 -> 9 + (-6) = 3
9์— ๋Œ€ํ•œ 6์˜ ๋ณด์ˆ˜๋Š” 3, ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ 9๋ฅผ ๊ธฐ์ค€๊ฐ’์œผ๋กœ ํ–ˆ์„ ๋•Œ "6์— ์–ด๋–ค ์ˆ˜๋ฅผ ๋”ํ•˜๋ฉด 9๊ฐ€ ๋ ๊นŒ์š”?" ๋‹ต์€ 3

์ด๋ ‡๊ฒŒ ๋ณด๋ฉด, ๋ณด์ˆ˜๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋ฒ•์€ ๋บ„์…ˆ์„ binary operator๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ unary operator๋กœ ์‚ฌ์šฉํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
์˜ˆ) a - b โ†’ a + (-b)
a์— ๋Œ€ํ•œ b์˜ ๋ณด์ˆ˜, ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ a๋ฅผ ๊ธฐ์ค€๊ฐ’์œผ๋กœ ํ•˜๊ณ , "b์— ์–ด๋–ค ์ˆ˜๋ฅผ ๋”ํ•˜๋ฉด a๊ฐ€ ๋ ๊นŒ์š”?" ๋‹ต์€ a-b

... ์œ„์˜ ๊ท€๋‚ฉ์  ์ถ”๋ก ์„ ์ ์šฉํ–ˆ์„ ๋•Œ, ๋ณด์ˆ˜๋ผ๋Š” ๊ฐœ๋…์€ ๊ฒฐ๊ตญ "์–ด๋– ํ•œ ๊ธฐ์ค€๊ฐ’์— ๋Œ€ํ•˜์—ฌ ์–ด๋–ค ์ˆ˜์— ๋ฌด์—‡์„ ๋”ํ•˜๋ฉด ๊ธฐ์ค€๊ฐ’์ด ๋ ๊นŒ์š”?"๋ผ๋Š” ๋ง์— ์ง€๋‚˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ“œ๋‹ค์‹œ ๋ฌธ์ œ๋กœ ๋Œ์•„์˜ค๋ฉด, num + x = target์ด ๋˜์–ด์•ผํ•˜๋Š”๋ฐ, ์ด๋•Œ ๋ณด์ˆ˜์˜ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•ด์„œ "num์— ์–ด๋–ค ์ˆ˜๋ฅผ ๋”ํ•˜๋ฉด target์ด ๋ ๊นŒ์š”?" ์ฆ‰, target = num + x๊ฐ€ ๋œ๋‹ค.
์ด๊ฒƒ์„ x์— ๋Œ€ํ•œ ์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด, x = target - num์ด ๋œ๋‹ค.

๋”•์…”๋„ˆ๋ฆฌ(a.k.a ํ•ด์‹œํ…Œ์ด๋ธ”)

๋น ๋ฅธ ํƒ์ƒ‰์„ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ์„œ key-value ์Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.

  • hash function ์— key ๊ฐ’์„ ์ž…๋ ฅ์œผ๋กœ ๋„ฃ์–ด ์–ป์€ ํ•ด์‹œ๊ฐ’ h(k)๋ฅผ ์œ„์น˜๋กœ ์ง€์ •ํ•˜์—ฌ key-value ๋ฐ์ดํ„ฐ ์Œ์„ ์ €์žฅ

๐Ÿ“ข์‚ฝ์ž…, ์‚ญ์ œ, ๊ฒ€์ƒ‰์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๋ชจ๋‘ O(1)์ด๋‹ค!!

Direct-address Table(์ง์ ‘ ์ฃผ์†Œํ™” ํ…Œ์ด๋ธ”)

๋จผ์ € ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ์™œ ์ถœํ˜„ํ–ˆ๋Š”์ง€๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์ง์ ‘ ์ฃผ์†Œํ™” ํ…Œ์ด๋ธ”์ด๋ผ๋Š” ๊ฐœ๋…์„ ๋จผ์ € ์•Œ์•„์•ผ ํ•œ๋‹ค. ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ๋ฆฌ์ŠคํŠธ(๋˜๋Š” ๋ฐฐ์—ด)์˜ ์ธ๋ฑ์Šค๋ฅผ key ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ key ์œ„์น˜์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

๐Ÿ‘Ž์ง์ ‘ ์ฃผ์†Œํ™” ํ…Œ์ด๋ธ”์˜ ๋ฌธ์ œ์ 
1. ๋ถˆํ•„์š”ํ•œ ๊ณต๊ฐ„ ๋‚ญ๋น„

  • ์œ„์˜ ๊ทธ๋ฆผ์—์„œ index๋ฅผ key๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ตœ๋Œ€ ์ €์žฅ ๊ณต๊ฐ„์€ ๋ฌด๋ ค 2022408์ด๋‚˜ ๋˜๋Š”๋ฐ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.
  1. Key ๊ฐ’์œผ๋กœ ๋ฌธ์ž์—ด์ด ์˜ฌ ์ˆ˜ ์—†๋‹ค.
  • ์ธ๋ฑ์Šค๋Š” ์ •์ˆ˜๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ

๐Ÿ‘‰๋”ฐ๋ผ์„œ, ์ง์ ‘ ์ฃผ์†Œํ™” ํ…Œ์ด๋ธ”์˜ ๋Œ€์•ˆ์œผ๋กœ, h(k)๋ฅผ index๋กœ ์‚ฌ์šฉํ•ด์„œ {key: value} ๋ฐ์ดํ„ฐ ์Œ์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด ๋”•์…”๋„ˆ๋ฆฌ(ํ•ด์‹œํ…Œ์ด๋ธ”) ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.

ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ํŠน์ง•

  1. ๋ชจ๋“  ๋ฐ์ดํ„ฐ์— key๊ฐ’์€ ๋ฌด์กฐ๊ฑด ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ, ์ค‘๋ณต๋˜๋Š” key๊ฐ’์ด ์žˆ์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.
    ๐Ÿ‘‰DB์˜ ๊ธฐ๋ณธํ‚ค๋ฅผ ์ƒ๊ฐํ•˜์ž

  2. Collision: ์„œ๋กœ ๋‹ค๋ฅธ key์˜ ํ•ด์‹œ๊ฐ’์ด ๋˜‘๊ฐ™์„ ๋•Œ๋ฅผ ๋งํ•œ๋‹ค.
    ์˜ˆ) h(k1) = a, h(k2) = a์ธ ๊ฒฝ์šฐ

  • collision์ด ๋ฐœ์ƒํ•˜๋ฉด ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(N)์œผ๋กœ ์ฆ๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋”•์…”๋„ˆ๋ฆฌ์˜ ๊ฐ•๋ ฅํ•œ ํž˜์„ ๋ฐœํœ˜ํ•˜๋Š” in ์—ฐ์‚ฐ์ž

in ์—ฐ์‚ฐ์ž: ๋”•์…”๋„ˆ๋ฆฌ์—์„œ key๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•ด์คŒ

  • if key๊ฐ€ ์กด์žฌ: return True, else: return False
  • ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๋‹จ O(1)!
    ๐Ÿง์ฐธ๊ณ ๋กœ, ๋ฆฌ์ŠคํŠธ์—๋„ in ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Š” ์„ ํ˜•ํƒ์ƒ‰์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(N)์ด ๊ฑธ๋ฆฐ๋‹ค.

๋”•์…”๋„ˆ๋ฆฌ์— ๊ด€ํ•œ ํ•จ์ˆ˜

  1. dictionary.items(): (key, value)์— ๋ชจ๋‘ ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉ
  2. dictionary.keys(): dictionary์˜ key๋“ค์— ์ ‘๊ทผํ•  ๋•Œ
  3. dictionary.values(): dictionary์˜ value๋“ค์— ์ ‘๊ทผํ•  ๋•Œ
  4. dictionary.get(): key์— ํ•ด๋‹นํ•˜๋Š” value๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉ

๋”•์…”๋„ˆ๋ฆฌ์™€ ๋ฆฌ์ŠคํŠธ์˜ ์ฐจ์ด์ 

  1. ๋”•์…”๋„ˆ๋ฆฌ: ํ•ด์‹œ๊ฐ’ h(k)๋ฅผ ์œ„์น˜๋กœ ์ง€์ •ํ•ด์„œ ์ˆœ์„œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌํ•  ์ˆ˜ ์—†์Œ
  2. ๋ฆฌ์ŠคํŠธ: ์ˆœ์„œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌ์ด ๊ฐ€๋Šฅ
    ๐Ÿ‘‰๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•  ๋•Œ๋Š” list๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.

์ž, ์ด์ œ ๋ณด์ˆ˜์™€ ๋”•์…”๋„ˆ๋ฆฌ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ดค์œผ๋‹ˆ, Two sum ๋ฌธ์ œ๋ฅผ ๋‹จ ํ•˜๋‚˜์˜ for๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ํ’€ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๋ฌผ์–ด๋ณด๋Š” ํฌ์ธํŠธ:
1. ๋”•์…”๋„ˆ๋ฆฌ์˜ key๋ฅผ ๋ฌด์—‡์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ๋„ˆ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์š”๊ตฌํ•˜๋Š” ๋‹ต์ด ๋ฌด์—‡์ธ์ง€ ์บ์น˜๋ฅผ ํ–ˆ๋ƒ๋Š”, "๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค 2๊ฐœ๋ฅผ ๋ฆฌํ„ด"ํ•˜๋ผ๋Š” ๊ฒƒ์„ ๋”•์…”๋„ˆ๋ฆฌ์˜ value๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋ฌผ์–ด๋ณด๋Š” ๋ฌธ์ œ์˜€๋‹ค.

  1. for๋ฌธ์—์„œ ์ˆœํšŒํ•˜๋Š” index์™€ ๋”•์…”๋„ˆ๋ฆฌ์˜ value๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋„ ๋ฌผ์–ด๋ณธ๋‹ค.
  2. ๋”•์…”๋„ˆ๋ฆฌ์˜ in ์—ฐ์‚ฐ์ž๊ฐ€ ์‹œ๊ฐ„๋ณต์žก๋„ O(1)์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์„ ์•„๋А๋ƒ๋„ ๋ฌผ์–ด๋ณธ๋‹ค.

โš™๏ธ์ฝ”๋“œ ์„ค๊ณ„

  1. ์ˆœํšŒํ•˜๋ฉด์„œ ์›์†Œ๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์–ด์„œ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉ
  • ์™œ๋ƒํ•˜๋ฉด nums์— ์ˆซ์ž๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๊ฒƒ์„ key๋กœ ์‚ฌ์šฉํ•˜๊ณ , ๋ฆฌํ„ดํ•˜๊ณ ์ž ํ•˜๋Š” ์ธ๋ฑ์Šค๋ฅผ value๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ => dict = {} // key: number, value: index
  1. for๋ฌธ์œผ๋กœ nums๋ฅผ ์ˆœํšŒํ•œ๋‹ค.
  2. ์ด๋•Œ ๋ณด์ˆ˜์˜ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰, target์— ๋Œ€ํ•œ num์˜ ๋ณด์ˆ˜๋Š” "num์— ์–ด๋–ค ์ˆ˜๋ฅผ ๋”ํ•˜๋ฉด target์ด ๋ ๊นŒ์š”?" => target = num + x <=> x = target - num
  3. num์˜ ๋ณด์ˆ˜๊ฐ€ ๋”•์…”๋„ˆ๋ฆฌ์— ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด ๋ณด์ˆ˜๋ฅผ key๋กœ ์‚ฌ์šฉํ•˜์—ฌ value๋ฅผ ๋ฆฌํ„ด
  • ์ด๋•Œ, num์˜ ์ธ๋ฑ์Šค๋ฅผ ์˜ค๋ฅธ์ชฝ์— ๋‘๋Š”๋ฐ, ์™œ๋ƒํ•˜๋ฉด ๋ณด์ˆ˜๋Š” ์ด๋ฏธ ์ด์ „์— ์ €์žฅํ•œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ
    4-1) ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ๋”•์…”๋„ˆ๋ฆฌ์— num์„ ์ €์žฅ

๐Ÿ’ป์ฝ”๋“œ ๊ตฌํ˜„


class Solution(object):
    def twoSum(self, nums, target):
    	num_to_index = {}
        
        for i, num in enumerate(nums):
        	# ๋ณด์ˆ˜ ๊ฐœ๋… ์‚ฌ์šฉ
            x = target - num
            
            if x in num_to_index:
            	return [num_to_index[x], i]
            num_to_index[num] = i

โฐ์‹œ๊ฐ„๋ณต์žก๋„: ๋‹จ ํ•˜๋‚˜์˜ for๋ฌธ์„ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆœํšŒํ•˜๋ฏ€๋กœ O(N)


๐Ÿ“š์ฐธ๊ณ  ์ž๋ฃŒ
๐Ÿ”—๋ณด์ˆ˜: https://devraphy.tistory.com/279

profile
๋ชจ๋“  ์ฝ”๋“œ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ๊ธฐ์— ์›์ธ์„ ํŒŒ์•…ํ•  ๋•Œ๊นŒ์ง€ ์ง‘์š”ํ•˜๊ฒŒ ํƒ๊ตฌํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€