Tech for good

[Leetcode/Binary Search] 4. Median of Two Sorted Arrays ๋ณธ๋ฌธ

IT/Computer Science

[Leetcode/Binary Search] 4. Median of Two Sorted Arrays

Diana Kang 2025. 2. 17. 00:55

https://leetcode.com/problems/median-of-two-sorted-arrays/description/

 


๐Ÿ”น ๋ฌธ์ œ ํ’€์ด ์ ‘๊ทผ

์ด ๋ฌธ์ œ๋Š” ๋‘ ๊ฐœ์˜ ์ •๋ ฌ๋œ ๋ฐฐ์—ด(nums1, nums2)์ด ์ฃผ์–ด์งˆ ๋•Œ, ๋ณ‘ํ•ฉ ํ›„ ์ค‘์•™๊ฐ’(median)์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.

 

โœ… ์ตœ์ ํ™” ๋ฐฉ๋ฒ• (์ด์ง„ ํƒ์ƒ‰ ํ™œ์šฉ)

  • ์ด์ง„ ํƒ์ƒ‰(Binary Search)์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ๋ฐฐ์—ด์„ ์ ˆ๋ฐ˜์œผ๋กœ ๋ถ„ํ• ํ•˜๋ฉด์„œ ๋‹ต์„ ์ฐพ์Œ.
  • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(log(min(m, n)))
class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        # nums1์ด ํ•ญ์ƒ ์งง์€ ๋ฐฐ์—ด์ด ๋˜๋„๋ก ๋ณด์žฅ
        if len(nums1) > len(nums2):
            nums1, nums2 = nums2, nums1
        
        x, y = len(nums1), len(nums2)
        low, high = 0, x
        
        while low <= high:
            partitionX = (low + high) // 2
            partitionY = (x + y + 1) // 2 - partitionX
            
            # ์™ผ์ชฝ ํŒŒํ‹ฐ์…˜์˜ ์ตœ๋Œ€๊ฐ’
            maxX = float('-inf') if partitionX == 0 else nums1[partitionX - 1]
            maxY = float('-inf') if partitionY == 0 else nums2[partitionY - 1]
            
            # ์˜ค๋ฅธ์ชฝ ํŒŒํ‹ฐ์…˜์˜ ์ตœ์†Œ๊ฐ’
            minX = float('inf') if partitionX == x else nums1[partitionX]
            minY = float('inf') if partitionY == y else nums2[partitionY]
            
            if maxX <= minY and maxY <= minX:
                # ๋ฐฐ์—ด์˜ ์ „์ฒด ๊ธธ์ด๊ฐ€ ์ง์ˆ˜์ธ ๊ฒฝ์šฐ
                if (x + y) % 2 == 0:
                    return (max(maxX, maxY) + min(minX, minY)) / 2
                else:
                    return max(maxX, maxY)
            
            elif maxX > minY:
                high = partitionX - 1  # ์™ผ์ชฝ์œผ๋กœ ์ด๋™
            else:
                low = partitionX + 1  # ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™

๐Ÿ”น ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๋ช… (Binary Search)

  1. nums1์„ ํ•ญ์ƒ ์งง์€ ๋ฐฐ์—ด๋กœ ์„ค์ •
    • nums1์ด nums2๋ณด๋‹ค ๊ธธ๋ฉด swap → ์ด์ง„ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”.
  2. ์ด์ง„ ํƒ์ƒ‰ ์ˆ˜ํ–‰
    • partitionX: nums1์„ ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ์œ„์น˜.
    • partitionY: nums2๋ฅผ ๋‚˜๋ˆ„๋Š” ์œ„์น˜ ((x + y + 1) // 2 - partitionX).
  3. ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ ํŒŒํ‹ฐ์…˜ ๊ฐ’ ๊ตฌํ•˜๊ธฐ
    • maxX: nums1 ์™ผ์ชฝ ๋ถ€๋ถ„ ์ตœ๋Œ€๊ฐ’.
    • maxY: nums2 ์™ผ์ชฝ ๋ถ€๋ถ„ ์ตœ๋Œ€๊ฐ’.
    • minX: nums1 ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ์ตœ์†Œ๊ฐ’.
    • minY: nums2 ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ์ตœ์†Œ๊ฐ’.
  4. ์กฐ๊ฑด ๊ฒ€์‚ฌ
    • maxX ≤ minY AND maxY ≤ minX → ์ค‘์•™๊ฐ’ ์ฐพ์Œ.
    • (x + y) % 2 == 0: ์ง์ˆ˜ ๊ฐœ → (max(left) + min(right)) / 2
    • ํ™€์ˆ˜ ๊ฐœ → max(left)
    • maxX > minY → high = partitionX - 1 (์™ผ์ชฝ ์ด๋™).
    • maxY > minX → low = partitionX + 1 (์˜ค๋ฅธ์ชฝ ์ด๋™).

๐Ÿ”น ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

  • ์ด์ง„ ํƒ์ƒ‰ ์‚ฌ์šฉ → O(log(min(m, n)))
  • ์ตœ์ข… ์‹œ๊ฐ„ ๋ณต์žก๋„: O(log(min(m, n)))
  • ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1) (์ถ”๊ฐ€ ๊ณต๊ฐ„ ์‚ฌ์šฉ ์—†์Œ)