[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% 가량의 빠르기 차이가 나는 이유가 무엇일까 고민해보게 된다.
Author And Source
이 문제에 관하여([LeetCode] 718. Maximum Length of Repeated Subarray), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@robotroniq/LeetCode-718.-Maximum-Length-of-Repeated-Subarray저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)