[LeetCode] 718. Maximum Length of Repeated Subarray

📃 문제 설명

(MEDIUM) https://leetcode.com/problems/maximum-length-of-repeated-subarray/

  • 주어진 두 array들에 동시에 나타나는 subarray의 최대 길이를 구하는 문제이다. array 내의 element 값은 0에서 100 사이이며, 두 array들의 길이는 최대 1000이다.

🔎 문제 접근

  • LCS (Longest Common Subsequence) 문제를 풀 때 사용한 DP 방법과 거의 흡사하게 풀었다.
  • dp[i][j]를 nums1 배열의 i번째와 nums2 배열의 j번째 element에서 시작한 공통 subarray의 길이 로 정의했다.
  • 이 때 dp[i][j]의 값은 다음과 같은 점화식을 통해 구할 수 있다.
    • nums1[i] == nums2[j]: dp[i-1][j-1] + 1
    • nums1[i] != nums2[j]: 0
    • 해당 점화식은 i > 0, j > 0 일 때 적용 가능하므로 i = 0일 때, j = 0일 때 dp 값은 따로 구해주도록 한다.

✨ 문제 풀이

class Solution:
    def findLength(self, nums1: List[int], nums2: List[int]) -> int:
        n1_len = len(nums1)
        n2_len = len(nums2)
        
        dp = [[0] * n2_len for _ in range(n1_len)]
        
        #i가 0일 때 dp 값 구하기
        for i in range(n2_len):
            dp[0][i] = 1 if nums1[0] == nums2[i] else 0
        
        #j가 0일 때 dp 값 구하기
        for i in range(n1_len):
            dp[i][0] = 1 if nums1[i] == nums2[0] else 0
        
        #나머지 경우일 때 dp 값 구하기
        for i in range(1, n1_len):
            for j in range(1, n2_len):
                dp[i][j] = (dp[i-1][j-1] + 1) if nums1[i] == nums2[j] else 0
        
        #구한 값들 중 최대값 반환
        return max(max(row) for row in dp)

  • 초반에는 for 문을 돌 때마다 max 값을 update해주는 식으로 코드를 작성했는데, 구한 값들에 대해 한 번에 max 값을 구하는 방식 이 훨씬 빨랐다. comparison 횟수도 동일한데, 30 ~ 40% 가량의 빠르기 차이가 나는 이유가 무엇일까 고민해보게 된다.

좋은 웹페이지 즐겨찾기