티스토리 뷰
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
The number of elements initialized in nums1 and nums2 are m and n respectively. You may assume that nums1 has enough space (size that is equal to m + n) to hold additional elements from nums2.
Example 1:
Input: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 Output: [1,2,2,3,5,6]
Example 2:
Input: nums1 = [1], m = 1, nums2 = [], n = 0 Output: [1]
Constraints:
- 0 <= n, m <= 200
- 1 <= n + m <= 200
- nums1.length == m + n
- nums2.length == n
- -109 <= nums1[i], nums2[i] <= 109
문제 설명:
정렬된 정수형 array인 nums1, nums2가 주어지고, nums2를 nums1에 합쳐 하나의 정렬된 array를 만든다.
nums1과 nums2의 원소 수는 각 n, m.이다.
nums1은 nums2가 채워질 수 있게 n + m의 충분한 공간을 가진다.
문제 해설:
단순하게 for문을 돌려, nums1의 빈자리에 nums2 원소들의 값을 넣는다.
그 후, sort()를 사용하여 정렬한다.
코드:
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
for i in range(n):
nums1[m + i] = nums2[i]
nums1.sort()
59 / 59 test cases passed.
Status: Accepted
Runtime: 32 ms
Memory Usage: 14.3 MB
Submitted: 0 minutes ago
다른 사람의 코드:
Runtime이 16ms인 코드:
temp를 별도로 사용해서 Memory Usage는 증가했을 것 같다.
nums1의 원소들과 크기 비교를 한다.
nums2[0]은 nums2의 원소들 중 가장 작은 값이다.
따라서, nums1[i]의 값보다 같거나 크다면 nums[i]를 저장하고, 아니라면 nums2[0]을 저장한다.
전자라면 i를 1 증가시켜 다시 비교를 하고, 후자라면 index를 1증가시켜 nums1[i]와 비교한다.
i가 m(nums1의 원소 수)보다 작다면, nums1의 원소들 중 nums2보다 큰 원소들이 있어, temp에 저장되지 못한 것이다.
즉, num2의 원소들은 temp에 다 저장되었으나, nums1의 원소들 중 일부가 저장되지 못한 것이다.
따라서 nums1의 남은 원소들을 temp에 저장한다.
j도 마찬가지이다. (nums1의 원소가 남아있었다면 수행되지 않는다.)
temp에는 합쳐진 정렬된 배열이 저장되어 있으므로 for문으로 nums1에 값을 넣는다.
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
#nums1[len(nums1)-len(nums2):] = nums2
#nums1.sort()
temp = [0]*(m+n)
i,j = 0,0
cursor = 0
while i<m and j<n:
if nums1[i]<=nums2[j]:
temp[cursor] = nums1[i]
i+=1
cursor+=1
else:
temp[cursor] = nums2[j]
j+=1
cursor+=1
while i<m:
temp[cursor] = nums1[i]
i+=1
cursor+=1
while j<n:
temp[cursor] = nums2[j]
j+=1
cursor+=1
for i in range(m+n):
nums1[i] = temp[i]
Memory Usage가 13900 KB인 코드:
내가 작성했던 코드와 방식은 비슷하나, for문을 사용하지 않아 memory usage를 높였다.
nums1을 m(nums1의 원소의 개수)까지 slice한 후, nums2를 붙였다. 그리고 sort하여 nums1에 대입한다.
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
nums1[:] = sorted((nums1[:m]+nums2))
비고:
단순하게 생각하지 않으면 오래 걸릴거 같아서, 직관적으로 문제를 풀었다.
프로그래머스에서는 코드 양이 짧으면 좋았던 걸(Memory Usage)로 기억하는데,
리트코드에서는 Runtime를 퍼센테이지를 먼저 보여주어서 그런지, Runtime에 신경쓰게 되는 것 같다.
'코딩테스트 > leetcode' 카테고리의 다른 글
692. Top K Frequent Words (Counter 사용) (0) | 2022.10.19 |
---|---|
118. Pascal's Triangle 파스칼의 삼각형 (0) | 2022.10.17 |
[프로그래머스][python] 더 맵게 (0) | 2021.01.12 |
[leetcode][python] Check If Two String Arrays are Equivalent (0) | 2021.01.10 |
[leetcode] [python] Kth Missing Positive Number (0) | 2021.01.08 |
- Total
- Today
- Yesterday
- notion
- 스프링 #시큐리티 #에러
- 파이썬
- python #프로그래머스 #완전탐색
- 에러로그
- 알고리즘
- python #leetcode #set
- dumps
- leetcode #python #알고리즘
- python #프로그래머스 #알고리즘
- flask
- 프로그래머스
- 프로그래머스 #heap #힙 #heapq #python
- python #leetcode #algorithm
- 선택정렬
- Tistory
- map
- MySQL
- C++
- bfs #백준 #2606 #python
- centOS7
- 정렬
- Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |