어제 풀지 못했던 문제 힌트를 보면서 이 문제를 풀어보려고 한다.
class Solution:
def duplicateZeros(self, arr: List[int]) -> None:
zero_cnt = 0
check_len = len(arr)-1
for num in range(len(arr)):
if num > check_len - zero_cnt:
break
if arr[num] == 0:
if num == check_len - zero_cnt:
arr[check_len] = 0
check_len -= 1
break
zero_cnt += 1
last = check_len - zero_cnt
for end in range(last,-1,-1):
if arr[end] == 0:
arr[end+zero_cnt] = 0
zero_cnt -= 1
arr[end+zero_cnt] = 0
else:
arr[end+ zero_cnt] = arr[end]
해설지에 나와있는 코드.
0이 있는지 확인하고 그 0의 갯수로 숫자들이 이동할 위치와
리스트 내 숫자들의 위치를 조정한다.
그러나 이 코드대로 작성하면 직관적이지도 않고 너무 길다.
그래서 생각해보니 어차피 길이는 유지되고 0이 하나 추가되면
리스트 끝에 있는 데이터가 지워지면 되는거 아닌가? 라는 생각이 들었다.
class Solution:
def duplicateZeros(self, arr: List[int]) -> None:
i = 0
while i < len(arr):
if arr[i] == 0:
arr.insert(i,0)
arr.pop()
i+=2
else:
i+=1
지금 위치에 있는 값이 0일 때는 0을 추가하기 때문에 지금 위치보다 두 칸 씩 뒤로 이동해야한다. 그렇지 않으면 다시 0을 찾고 0을 넣고를 반복하다가 나머지 리스트가 전부 0이 될 것이다.
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
for i in range(n):
nums1[i+m] = nums2[i]
nums1.sort()
두개의 리스트와 각각의 길이가 주어지고 nums1에는 nums2가 들어갈 공간이 0으로 주어져 있다. 이 문제는 len(nums1) - len(nums2) 는 항상 n이라는 것으로 쉽게 풀 수 있었다. 그래서 n번동안 이터레이션을 돌리면서 nums1의 m+i 값에 nums2의 i 값을 대입시키고 마지막으로 sort를 통해서 문제가 요구하는 순서도 맞추었다.