본문 바로가기

ALGORITHM

[Swift] LeetCode: Remove Duplicates from Sorted Array (inout)

https://leetcode.com/problems/remove-duplicates-from-sorted-array/

 

Remove Duplicates from Sorted Array - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

영어를 안읽고 .. 문제가 제일 중요하단건 알지만 .. 

in-place로 unique한 element가 한번만 배열에 나타나도록 하는 문제였다.

주어진 문제에서 inout 파라미터가 등장했는데 아래에서 알아보자

 

inout 

원래 함수로 전달받은 인자는 상수라서 변경이 불가능하다.

이 인자를 변경하기 위해서 inout 키워드를 붙여서 이를 가능하게 해준다.

그리고 이 함수를 호출할 때 파라미터에 &를 붙여서 전달해주면 된다.

 

func sample(num: inout Int) {
    num += 1
    print(num)
}

var num: Int = 2
sample(num: &num)

 

c++ 에서는 이러한 것을 call-by-reference 참조를 전달한다고 했는데

Swift 에서는 참조를 전달하는 것이 아니다.

 

Swift 에서의 값이 전달되는 과정은

 

1. 함수가 호출됐을 때, 값으로 전달받은 인자가 복사(Copy) 된다.

2. 함수 내에서는 복사본이 변경된다.

3. 함수가 반환(Return) 될 때, 복사본의 값이 원래의 값에 할당(Assign) 된다.

 

이러한 방식은 copy-in-copy-out 이나 call by value result 로 불린다고 한다.

 

함수에서 in-out 변수로 전달된 값을 원래의 값이 현재의 스코프에서 접근이 가능하다 하더라도 접근하지 말아야 한다. 원래의 값에 접근하는 것은 값에 동시 접근하는 것이고, 이것은 스위프트의 메모리 배제 보장을 위반하는 것이다. 같은 이유로, 여러개의 In-out 파라미터로 같은 값을 전달하면 안된다.

 

in-place 알고리즘

추가적인 메모리를 쓰지않는 알고리즘

내부에서 모든걸 해결하는 알고리즘이라고 기억을..했을 것이다.

+ 아주 적은 메모리를 사용해도는 된다.

 

 

전체코드

class Solution {
    func removeDuplicates(_ nums: inout [Int]) -> Int {
        var index = 0
        for num in nums where num != nums[index] {
            index += 1
            nums[index] = num
        }
        return index + 1
    }
}

 

 

 

 

참조

https://yoojin99.github.io/app/inout-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0%EC%99%80-willSet-didSet/