< All posts

718. Maximum Length of Repeated Subarray

๋ฌธ์ œ ์„ค๋ช…

๋ฐฐ์—ด์ด ๋‘ ๊ฐœ ์ฃผ์–ด์งˆ ๋•Œ, ๋‘ ๋ฐฐ์—ด์—์„œ ๊ณตํ†ต์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฐ€์žฅ ๊ธด ์—ฐ์† ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

718

ํ’€์ด ๋ฐ ํ•ด์„ค

์ด ๋ฌธ์ œ๋ฅผ ์ฒ˜์Œ ํ’€์–ด๋ณผ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ํ’€์–ด๋ดค์Šต๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  nums1์˜ ์š”์†Œ๋งˆ๋‹ค ์ˆœํšŒ
  2. ๋ชจ๋“  nums2์˜ ์š”์†Œ๋งˆ๋‹ค ์ˆœํšŒ (๋‘๊ฐœ๊ฐ€ ๋™์ผํ•  ๊ฒฝ์šฐ ์ผ์น˜ subarray ์ฐพ์•˜๋‹ค๊ณ  ์ธ์‹)
  3. ์ผ์น˜ํ•˜๋Š” ๊ธธ์ด๋ฅผ ์นด์šดํŠธ

a

ํ’€์ด

class Solution:
    def findLength(self, nums1: List[int], nums2: List[int]) -> int:
        idx1 = 0
        max_len = 0
        while idx1 < len(nums1): # for each subarr1

            for i2 in range(len(nums2)): # find matching starts subarr2
                n = 0

                # find how long that match goes
                while i2+n < len(nums2) and idx1+n < len(nums1) and nums2[i2+n] == nums1[idx1+n]: 
                    max_len = max(max_len, n+1)
                    print(nums1[idx1:idx1+n+1], "matches", nums2[i2:i2+n+1])
                    n += 1

            idx1 += 1
        
        return max_len

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ ‡๊ฒŒ ํ•  ๊ฒฝ์šฐ while/for ๋ฌธ์ด 3์ข…์œผ๋กœ ์ค‘์ฒฉ๋˜์–ด ๋‹จ๋ฒˆ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(n^3)์œผ๋กœ ๋น„ํšจ์œจ์ ์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ํ…Œ์ŠคํŠธ๋Š” ํ’€๋ฆด์ง€์–ธ์ • ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด ์˜ˆ์ƒ๋˜๋ฉฐ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

2์ฐจ ๊ฐœ์„ 

์—ญ์‹œ ์ด ๋ฌธ์ œ๋Š” DP๋กœ ์ ‘๊ทผํ• ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. DP ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด์„œ ๊ฐ ์ธ๋ฑ์Šค๋งˆ๋‹ค์˜ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. Longest Common Substring ๋ฌธ์ œ์™€ ๋™์ผํ•œ ์ ‘๊ทผ๋ฒ•์ž…๋‹ˆ๋‹ค.

class Solution:
    def findLength(self, nums1: List[int], nums2: List[int]) -> int:
        n,m = len(nums1), len(nums2)
        dp = [[0] * (m+1) for _ in range(n+1)]
        max_val = 0

        for i in range(1,n+1):
            for j in range(1,m+1):
                if nums1[i-1] == nums2[j-1]:
                    dp[i][j] = dp[i-1][j-1] + 1
                    max_val = max(max_val, dp[i][j])
        
        return max_val

Complexity Analysis

tc

์‹œ๊ฐ„ ๋ณต์žก๋„

  • O(n*m)์ด๋‹ค. ์—ฌ๊ธฐ์„œ n๊ณผ m์€ ๊ฐ๊ฐ nums1๊ณผ nums2์˜ ๊ธธ์ด์ด๋‹ค. ๋‘๊ฐœ ๊ฐ™์€ ๊ธธ์ด์ผ ๊ฒฝ์šฐ O(n^2)์ด๋‹ค.

๊ณต๊ฐ„ ๋ณต์žก๋„

  • O(nm)์ด๋‹ค. DP ํ…Œ์ด๋ธ”์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด nm ํฌ๊ธฐ์˜ 2์ฐจ์› ๋ฐฐ์—ด์ด ํ•„์š”ํ•˜๋‹ค.

Constraint Analysis

Constraints:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 100

References

ยฉ 2025 HyunJoon Sung. All Rights Reserved.

GitHub