๋ฌธ์ ๋งํฌ
https://leetcode.com/problems/longest-non-decreasing-subarray-from-two-arrays/
๋ฌธ์ ์์ฝ
๋ ๊ฐ์ ๋ฐฐ์ด 0-indexed ์ ์๋ฅผ ์์๋ก ๊ฐ์ง๋ nums1
๊ณผ nums2
์ ๋ฐฐ์ด์ ์์๋ฅผ ํ๋์ฉ ๊ฐ์ ธ์ nums3
๋ฐฐ์ด์ ๋ง๋ค๋ ค๊ณ ํ๋ค.
nums3
๋ผ๋ ๋ฐฐ์ด์ ์์๋ nums1
๋๋ nums2
์ ์์ ์ค ํ๋๋ฅผ ๊ฐ์ ธ์ ํ ๋นํ ์ ์๋ค.
nums1[i] or nums2[i] = nums3[i]
์ด ๋ฌธ์ ์์ ๊ตฌํด์ผํ๋ ๊ฐ์ nums3
๋ฐฐ์ด ์์์ length of the longest non-decreasing subarray
,
์ฝ๊ฒ ๋งํด ๋ฐฐ์ด์ ์์๊ฐ ๊ฐ์ํ์ง ์๊ณ ๊ฐ๊ฑฐ๋ ์ฆ๊ฐํ๋ ๊ฐ์ผ๋ก ๋ ๊ฐ์ฅ ๊ธด ์๋ธ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํด์ผ ํ๋ค.
longest non-decreasing subarray = ๊ฐ์ํ์ง ์๋ ๊ฐ์ฅ ๊ธด ์๋ธ ๋ฐฐ์ด
๋ค์ ๋งํด์ nums3
๋ฐฐ์ด ์์์ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ ๊ฐ์ฅ ๊ธด ์๋ธ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ผ๋ ๋ง์ด๋ค.
์๋ฅผ ๋ค์ด, nums3
๋ฐฐ์ด์ ์์๊ฐ [5, 1, 2, 3, 4]
๋ผ๊ณ ํ๋ค๋ฉด ๊ฐ์ฅ ๊ธด subarray
๋ [1, 2, 3, 4]
๊ฐ ๋๋ฏ๋ก ๊ธธ์ด๋ 4
๊ฐ ๋๋ค.
[ 5, 1, 2, 3, 4 ]
|-- subarray --|
๋ฌธ์ ํ์ด
์์งํ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ๋์ ๋ฐ๋ก ์ดํด๊ฐ ๋์ง ์์์ ์์ ๋ฅผ ๋ณด๋ฉด์ ์ดํดํ๋ ค๊ณ ํ๋ ๊ฒ ๊ฐ๋ค.
์์ ์์ nums1 = [2, 3, 1]
, nums2 = [1, 2, 1]
์ด ์ฃผ์ด์ง๊ณ nums3
๋ฅผ ๊ตฌํด์ผ ํ๋ค.
๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ ์ด๋ป๊ฒ ์ด๋ ๊ฒ ๋์ค๋์ง ํด์ํด๋ดค๋ค.
| ๋ฐฐ์ด | 0 | 1 | 2 |
|nums1| 2 | 3 | 1 |
|nums2| 1 | 2 | 1 |
-------------------
|nums3| 1 | 2 | 1 |
๋จผ์ nums3[0]
์ ๊ตฌํด์ผ ํ๋ค.
๋ ๋ฐฐ์ด์ ์ฒซ ๋ฒ ์งธ ์์๋ nums1[0] = 2
, nums2[0] = 1
์ด๋ค. ์ค๋ฆ์ฐจ์์ด์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฒ์์ผ๋ก ์ค๋ ์์๋ ๋ ์ค ์๋ฌด ๊ฐ์ด๋ ์๋ ๊ธธ์ด๋ ๊ฐ์ง๋ง ๊ฐ์ฅ ์์ ๊ฐ์ด ํ ๋น๋์ด์ผ ๋ ๊ธด ๋ฐฐ์ด์ ๋ง๋ค ์ ์๋ค.
๋ฐ๋ผ์, nums3[0] = nums2[0] = 1
์ด ๋๋ค. ์ด ๋ subarray ์ ๊ธธ์ด๋ ์ต์ด 1
์ด ๋๋ค.
๋ค์์ผ๋ก nums3[1]
์ ๊ตฌํด์ผ ํ๋ค.
์ค๋ฆ์ฐจ์์ด ๋๊ธฐ ์ํด์๋ nums3[0]
๋ณด๋ค ์ปค์ผํ๋ค. ๊ทธ๋์ nums3[0] < nums3[1]
์ด ๋์ด์ผ ํ๋ค.
nums1[1] = 3
๊ณผ nums2[1] = 2
์ ํ์ธํด๋ณด๋ฉด ๋ ๋ค nums3[0]
๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
๊ทธ๋ผ ์ด๋ค ๊ฐ์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋์ง ๋ดค์ ๋ ๋ ์์ ๊ฐ์ ๋ฃ์ด์ฃผ์ด์ผ ๋ค์ ๊ฐ์ด ์ค๋ฆ์ฐจ์์ผ๋ก ์ฌ ๊ฐ์ด ๋ง์์ง๊ธฐ ๋๋ฌธ์ ๋ ์์ ๊ฐ์ธ nums2[1]
์ ๊ฐ์ ๋ฃ์ด์ค๋ค.
๋ฐ๋ผ์, nums3[1] = nums2[1] = 2
์ด ๋๋ค. ์ด ๋ ์ค๋ฆ์ฐจ์์ด ๋์๊ธฐ ๋๋ฌธ์ subarray ์ ๊ธธ์ด๋ 2
๊ฐ ๋๋ค.
๋ง์ง๋ง์ผ๋ก nums3[2]
๋ฅผ ๊ตฌํด์ผ ํ๋ค.
nums1[1] = 1
๊ณผ nums2[1] = 1
์ ํ์ธํด๋ณด๋ฉด ๋ ๋ค nums3[0]
๋ณด๋ค ์๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ์ค๋ฆ์ฐจ์์ด ๋์ง ์๋๋ค.
์ด ๋, ์ ์ํด์ผํ ์ ์ ์ค๋ฆ์ฐจ์์ด ๋ ์ด์ ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ค์ subarray ์ ๊ธธ์ด๊ฐ 1์ด ๋๋ค๋ ์ ์ด๋ค.
๋ฐ๋ผ์, nums3
๋ฐฐ์ด์ Subarray ๊ธธ์ด๋ ์ต๋ 2
๊ฐ ๋๋ค. ( Subarray [1, 2]
in nums3 [1, 2, 1]
)
์ด๋ฌํ ๊ณผ์ ์ผ๋ก Subarray ์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ฉด ๋๋ ๋ฌธ์ ๋ค.
์กฐ๊ฑด : ์ค๋ฆ์ฐจ์์ด ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋ฉด Subarray ์ ๊ธธ์ด๊ฐ ์ด๊ธฐํ๋๋ค.
์ฌ๊ธฐ์ ์กฐ๊ฑด์ ํตํด ํ ๊ฐ์ง ํ์ธํ ์ ์๋ ์ ์ ๊ธธ์ด๊ฐ ์ ์ ๋์ด๋๋ค๊ฐ ๋ค์ 1๋ก ์ค์ด๋ ๋ค๋ ์ ์ด๋ค.
์ด ์กฐ๊ฑด์ ํ์ธํ๊ณ ๋์ ๊ฐ์ ๋น๊ตํด์ ํธ๋ ๊ฒ์ด ์๋ ๊ธธ์ด๋ฅผ ๋น๊ตํด์ ํ์ด์ผ ํ๋ค๋ ์๊ฐ์ด ๋ค์๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ด ์์ ์กฐ๊ฑด๋ค์ ๋ง๋ Subarray ๊ฐ ๋๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋น๊ตํด๋ดค๋ค.
์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ด nums1, nums2 ์ ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋ค๊ณ ์๊ฐํด๋ณด์.
๋ ๋ฐฐ์ด์ ํตํด ๋ง๋ค์ด์ง ์ ์๋ nums3 ์ Subarray ๊ฐ ๋ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด์
nums1
์ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ์ nums2
์ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ๋ก ๊ตฌ๋ถํด์ ๊ฐ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๋ฐ์ ธ๋ณด์๋ค.
์์ ๊ทธ๋ฆผ์ ๋ํด์ ์ค๋ช ํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
-
์ฒซ ๋ฒ์งธ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ
nums1[0] = 4
์ ์์๋ฅผ ๊ฐ์ ธ์จ๋ค๊ณ ํ ๋ ์ฒซ ๋ฒ์งธ ์์์ ๊ฐ์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ Subarray ์ ์ต๋ ๊ธธ์ด๋1
์ด ๋๋ค.nums2[0] = 8
์ ์์๋ฅผ ๊ฐ์ ธ์จ๋ค๊ณ ํ ๋ ์ฒซ ๋ฒ์งธ ์์์ ๊ฐ์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ Subarray ์ ์ต๋ ๊ธธ์ด๋1
์ด ๋๋ค.
-
๋ ๋ฒ์งธ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ
nums1[1] = 16
์ ์์๋ฅผ ๊ฐ์ ธ์จ๋ค๊ณ ํ ๋num1[0] = 4
๋ณด๋ค ํฌ๊ณnums2[0] = 8
๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์
nums1
,nums2
์ ์์๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒฝ์ฐ Subarray ๊ฐ ์ฑ๋ฆฝํ๋ค.
๋ฐ๋ผ์, Subarray ์ ์ต๋ ๊ธธ์ด๊ฐ2
๊ฐ ๋๋ค.nums2[1] = 4
์ ์์๋ฅผ ๊ฐ์ ธ์จ๋ค๊ณ ํ ๋num1[0] = 4
๊ณผ ๊ฐ๊ณnums2[0] = 8
๋ณด๋ค ์๊ธฐ ๋๋ฌธ์
nums1
์ ์์๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒฝ์ฐ Subarray ๊ฐ ์ฑ๋ฆฝํ๋ค.
๋ฐ๋ผ์, Subarray ์ ์ต๋ ๊ธธ์ด๊ฐ2
๊ฐ ๋๋ค.
-
์ธ ๋ฒ์งธ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ
nums1[2] = 10
์ ์์๋ฅผ ๊ฐ์ ธ์จ๋ค๊ณ ํ ๋num1[1] = 16
๋ณด๋ค ์์ง๋งnums2[1] = 4
๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์
nums2
์ ์์๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒฝ์ฐ์๋ง Subarray ๊ฐ ์ฑ๋ฆฝํ๋ค.
๋ฐ๋ผ์, Subarray ์ ์ต๋ ๊ธธ์ด๊ฐ3
๊ฐ ๋๋ค.nums2[2] = 1
์ ์์๋ฅผ ๊ฐ์ ธ์จ๋ค๊ณ ํ ๋num1[1] = 16
๋ณด๋ค ์๊ณnums2[1] = 4
๋ณด๋ค ์๊ธฐ ๋๋ฌธ์
Subarray ๊ฐ ์ฑ๋ฆฝํ์ง ์๋๋ค.
๋ฐ๋ผ์, Subarray ์ ์ต๋ ๊ธธ์ด๊ฐ1
๊ฐ ๋๋ค.
-
๋ค ๋ฒ์งธ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ
nums1[3] = 8
์ ์์๋ฅผ ๊ฐ์ ธ์จ๋ค๊ณ ํ ๋num1[2] = 10
๋ณด๋ค ์์ง๋งnums2[2] = 1
๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์
nums2
์ ์์๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒฝ์ฐ์๋ง Subarray ๊ฐ ์ฑ๋ฆฝํ๋ค.
๋ฐ๋ผ์, Subarray ์ ์ต๋ ๊ธธ์ด๊ฐ2
๊ฐ ๋๋ค.nums1[3] = 9
์ ์์๋ฅผ ๊ฐ์ ธ์จ๋ค๊ณ ํ ๋num1[2] = 10
๋ณด๋ค ์์ง๋งnums2[2] = 1
๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์
nums2
์ ์์๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒฝ์ฐ์๋ง Subarray ๊ฐ ์ฑ๋ฆฝํ๋ค.
๋ฐ๋ผ์, Subarray ์ ์ต๋ ๊ธธ์ด๊ฐ2
๊ฐ ๋๋ค.
์ด๋ ๊ฒ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ธํ๊ณ ๋์ ๊ฐ ์์๋ง๋ค ๊ธธ์ด๊ฐ ํฐ ๊ฐ์ด ๊ทธ ์์ ์์น์์์ Subarray ์ ์ต๋ ๊ธธ์ด๊ฐ ๋๋ค๊ณ ์๊ฐํ ์ ์๋ค.
๋ฐ๋ผ์, ์๋์ ๊ฐ์ด Subarray ์ ๊ธธ์ด๊ฐ ์ต๋๊ฐ ๋๋ nums3
๋ฐฐ์ด์ ํ์ธํ ์ ์๋ค.
์ด์ ์ด์ ๊ฐ์ ๊ณผ์ ์ ์ฝ๋๋ก ์์ฑํด์ฃผ๋ฉด ๋๋ค.
๋์ ํ๋ก๊ทธ๋๋ฐ์ ํตํด ๋ฌธ์ ๋ฅผ ํ ์ ์์๋๋ฐ ๋ค์๊ณผ ๊ฐ์ด dp ๋ฅผ ์ ์ํด์ฃผ์๋ค.
dp ์ ์ด๊ธฐ๊ฐ์ 1 ๋ก ์ค์ ํ ์ด์ ๋ Subarray ๋ ์ต์ ํ๋์ ์์๊ฐ ์๋ ๊ฒฝ์ฐ ์ฑ๋ฆฝํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ๊ธธ์ด๋ 1 ์ด ๋์ด ์ด๊ธฐ๊ฐ์ 1๋ก ์ค์ ํด์ฃผ์๋ค.
dp = [[1] * 3 for _ in range(len(nums1))]
max_length = dp[0][2]
๊ฐ ์์์ ๊ฐ์ Subarray ์ ๊ธธ์ด ๊ฐ์ ๊ฐ์ง๋ 2๊ฐ์ ์์์ nums1 ๊ณผ nums2 ์ ๊ฐ ์ค์์ ์ด๋ค ๊ฐ์ด ๋ ๊ธธ์ด๊ฐ ๊ธด์ง ํ์ธ ํ์ ๋ง์ง๋ง ์์์ ์ต๋ ๊ธธ์ด๋ฅผ ์ ์ฅํด์ฃผ์๋ค.
max_length
์ ๊ฐ์ ์ฒซ ๋ฒ์งธ ์์์ ์ต๋ ๊ธธ์ด๋ก ์ด๊ธฐํ ํด์ฃผ์๋ค.
์ด์ ์์์ ์ ๋ฆฌํ ๋ด์ฉ๋๋ก ๊ฐ ๊ฒฝ์ฐ์ ๋ํด์ ์์๋ฅผ ๊ฐ์ ธ์ ๋น๊ต ํ์ ์ต๋ ๊ธธ์ด๋ฅผ ๊ตฌํด์ค๋ค.
for i in range(1, len(nums1)):
# nums1 ์ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ
if nums1[i-1] <= nums1[i] and nums2[i-1] <= nums1[i]:
dp[i][0] = dp[i-1][2] + 1
elif nums1[i-1] <= nums1[i]:
dp[i][0] = dp[i-1][0] + 1
elif nums2[i-1] <= nums1[i]:
dp[i][0] = dp[i-1][1] + 1
else:
dp[i][0] = 1
# nums2 ์ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ
if nums1[i-1] <= nums2[i] and nums2[i-1] <= nums2[i]:
dp[i][1] = dp[i-1][2] + 1
elif nums1[i-1] <= nums2[i]:
dp[i][1] = dp[i-1][0] + 1
elif nums2[i-1] <= nums2[i]:
dp[i][1] = dp[i-1][1] + 1
else:
dp[i][1] = 1
# nums1 ๊ณผ nums2 ์ ๊ธธ์ด ์ค ๋ ํฐ ๊ฐ์ ๊ตฌํ๋ค.
dp[i][2] = max(dp[i][0], dp[i][1])
# nums3 ์ Subarray ์ ์ต๋ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ค.
max_length = max(dp[i][2], max_length)
์ ์ถ ๋ต์
"""
์คํ ์๊ฐ: 882 ms
๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ: 41.74 MB
์๊ฐ ๋ณต์ก๋: O(N)
"""
class Solution:
def maxNonDecreasingLength(self, nums1: List[int], nums2: List[int]) -> int:
dp = [[1] * 3 for _ in range(len(nums1))]
max_length = dp[0][2]
# nums1 ์ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ
for i in range(1, len(nums1)):
if nums1[i-1] <= nums1[i] and nums2[i-1] <= nums1[i]:
dp[i][0] = dp[i-1][2] + 1
elif nums1[i-1] <= nums1[i]:
dp[i][0] = dp[i-1][0] + 1
elif nums2[i-1] <= nums1[i]:
dp[i][0] = dp[i-1][1] + 1
else:
dp[i][0] = 1
# nums2 ์ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ
if nums1[i-1] <= nums2[i] and nums2[i-1] <= nums2[i]:
dp[i][1] = dp[i-1][2] + 1
elif nums1[i-1] <= nums2[i]:
dp[i][1] = dp[i-1][0] + 1
elif nums2[i-1] <= nums2[i]:
dp[i][1] = dp[i-1][1] + 1
else:
dp[i][1] = 1
# nums1 ๊ณผ nums2 ์ ๊ธธ์ด ์ค ๋ ํฐ ๊ฐ์ ๊ตฌํ๋ค.
dp[i][2] = max(dp[i][0], dp[i][1])
# nums3 ์ Subarray ์ ์ต๋ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ค.
max_length = max(dp[i][2], max_length)
return max_length