ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift) 배열의 중복체크
    Swift 2019. 7. 25. 01:26

    두 배열에서 공통된 원소가 있는지, 확인하려면 어떻게 해야할까? 또 중복되는 원소를 제거하려면 어떻게 해야할까?

    저같은 초보는 간단해보이는 이 질문의 답을 swift 에서 하기가 참 어려웠습니다.. 그래서 같이 한번 알아볼까해요!


    저는 두 가지 방법을 소개해드릴까 합니다.

    1. 인덱스를 찾아 두 배열에서 중복 요소들을 제거
    2. 중복 요소들을 필터링해서 새로운 두 배열을 만듦

    본격적으로 들어가기에 앞서 기본적으로 알아야 할 함수를 먼저 알아보고 가죠!

    요소 확인 contains(element: )

    내가 원하는 원소가 있는지 확인하려면 어떻게 해야할까요? 네 배열의 contains(element: ) 함수를 사용하면 됩니다!

    하지만 이 아이는 조금 아쉬워요.. 바로 리턴값이 Bool 이라는 것이죠. 네 포함하는지 안 하는지만 알려줄뿐이죠.. 인덱스라도 좀 알려주면 좋을텐데 말이죠.. 괜찮습니다! 있다는 사실을 알았으니 인덱스를 찾던, 필터링을 하던 방법을 찾아 나가면 되니깐요!!

    1. 인덱스를 찾아 중복 제거

    특정 원소의 인덱스 찾기

    특정 원소의 인덱스를 찾으려면 어떻게 할까요? 배열.index(... ) 를 아무리 열심히 찾아봐도 원하는 녀석이 잘 안 보이시죠? 예전 버전에서는 index(of: ) 라는 함수가 있었던 것 같은데 Swift 4 점대 버전부터는 firstIndex(of:) 혹은 lastIndex(of: ) 라는 함수로 특정 원소의 인덱스를 찾을 수가 있답니다!

    let array1 = [1, 2, 3]
    array1.firstindex(of: 2) // 1

    중복 제거

    이제 인덱스를 찾는 방법도 알았으니 실제로 두 배열에서 중복 요소들을 제거해볼게요! 한 배열에서 for 문을 돌면서 나머지 배열에 원소가 있다면 인덱스를 찾아 제거하는 방식입니다!

    var array1 = [1, 2, 3]
    var array2 = [3, 4, 5]
    
    for a in array1 {
        if array2.contains(a), let idx1 = array1.firstIndex(of: a), let idx2 = array2.firstIndex(of: a) {
            array1.remove(at: idx1)
            array2.remove(at: idx2)
        }
    }
    
    print(array1)    // [1, 2]
    print(array2) // [4, 5]

    array1 에서 for 문을 사용할 때, enumerated() 를 사용해 인덱스를 바로 찾을 수도 있지만, 이렇게 하면 remove를 하는 순간 array1 의 배열에 인덱스가 바껴버리기 때문에 out of index 에러가 발생할 수 있습니다! 그래서 조금 귀찮지만 굳이 array1의 인덱스도 다시 찾아주었어요.

    2. 중복요소 필터링

    중복 요소를 필터링한다.. 딱 떠오르는 함수가 있으시죠? 네 바로 filter 함수 입니다.

    사용법은 크게 어렵지 않으니 바로 예제를 살펴볼게요! contains 를 사용해 나머지 배열이 갖고 있지 않은 녀석들만 필터링해서 새롭게 배열을 만드는 방식이에요!

    let arr1 = array1.filter{!array2.contains($0)}
    let arr2 = array2.filter{!array1.contains($0)}


    사실 첫 번째 방법은 제가 처음 떠올린 생각이었고, 두 번째 방법은 검색하여 찾은 방법인데요, 두 번째 방법이 더 직관적이고 간결해보이네요! 전에는 **정답** 을 찾아서 고민을 많이 했었는데, 상황에 더 나은 방식은 있을지언정 코딩에 정답은 없는 것 같아요. 여러가지 방식을 익히고 다방면으로 생각할 줄 알아야겠죠! 저는 두 가지 방식을 소개했지만 아마 방식은 무궁무진하게 많이 있을거라 생각이 들어요 ㅎ 저도 다른 방식이 생각나면 추가로 업로드하겠지만, 혹시 다른 방법이 있다면 댓글로 남겨주시면 감사하겠습니다!

    조금이라도 도움이 되셨기를 바라며..! 감사합니다.

    'Swift' 카테고리의 다른 글

    Class vs Struct in Swift  (0) 2019.10.21
    KVO(Key-Value-Observing)  (0) 2019.09.20
    Swift) 소수점 다루기  (0) 2019.07.22
    Swift) 스위프트에서 '모든 것은 객체다'  (1) 2019.07.02
    열거형 (Enumerations)  (0) 2019.06.26

    댓글

Designed by Tistory.