아침공부 5.17

코변·2022년 5월 16일
0

아침공부

목록 보기
1/4

개인공부

05:00 ~ 07:00 리트코딩 풀기

1089. Duplicate Zeros

어제 풀지 못했던 문제 힌트를 보면서 이 문제를 풀어보려고 한다.

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를 통해서 문제가 요구하는 순서도 맞추었다.

profile
내 것인 줄 알았으나 받은 모든 것이 선물이었다.

0개의 댓글