NewGen

ios 알고리즘 연습 : 해시 본문

IOS

ios 알고리즘 연습 : 해시

Deep Learning 2020. 12. 21. 23:23

 

 

 

 

 

func solution_best(_ clothes:[[String]]) -> Int {

        let dict: [String: Int] = clothes.reduce(into: [:]) {

            //한가지만 입을경우가 있으므로 디폴트가 1

            $0[$1[1], default: 1] += 1;

        }

        print("dict=\(dict)")

        return dict.reduce(1) { $0 * $1.1 } - 1

    }

 

Dictionary Type 에서 reduce가 어떻게 동작하는지 알아보려면.. 아래 코드 넣어서 테스트 해보자..

 

        //reduce가 어떻게 동작하는지 알아보는 코드

        let n1 = dict.reduce(0) { $0+$1.1}

        let n2 = dict.reduce(2) { $0+$1.1}

 

        print("n1=\(n1), n2=\(n2)")

 

        let array = [1, 1, 2, 3,4]

        let newArray = array.reduce(1) { $0 * $1 }

        print("newArray=\(newArray)") //6

 

        let charArray = ["a", "b", "c", "d"]

        let charNewArray = charArray.reduce("result is ") { $0 + $1 }

        print("charNewArray=\(charNewArray)") //result is abcd

        //reduce가 어떻게 동작하는지 알아보는 코드

        

 

 

맵(Map) : 컨테이너가 담고 있던 각각의 값을 매개변수를 통해 받은 함수에 적용한 후 새로운 컨테이너를 생성하여 반환 (기존 컨테이너의 값은 변경되지 않음)

시퀀스(Sequence), 콜렉션(Collection) 프로토콜을 따르는 타입과 옵셔널은 모두 맵을 사용할 수 있다. (배열, 딕셔너리, 세트, 옵셔널)

for-in 구문 사용하는것과 비슷하나 코드가 더 간결하고 컴파일러 차원에서 성능 차이가 있다. 

array example : 

         let array = [0, 1, 2, 3]

        let newArray = array.map { $0 * 5 }

        print(newArray) //[0, 5, 10, 15]

 

dictionary example :  

        let dictionary = ["key1":"value1", "key2":"value2"]

        

        let keys = dictionary.map { $0.0 }

        let values = dictionary.map { $0.1 }

        

        print(keys) //["key1", "key2"]

        print(values) //["value1", "value2"]

        

        let keys2 = dictionary.map { $0.0 + "a" }

        let values2 = dictionary.map { $0.1 + "b" }

        

        print(keys2) //["key1a", "key2a"]

        print(values2) //["value1b", "value2b"]

 

 

 Filter : 반환타입이 Bool인 매개변수 함수 의 결과가 true면 새로운 컨테이너에 값을 담아 반환 

        let array = [0, 1, 2, 3]

        let filteredArray = array.filter { $0%2 == 0 }

        print(filteredArray) //[0, 2]

 

reduce: 매개변수로 전달받은 함수의 연산 결과로 각 배열의 모든 값을 합침

initial 매개변수로 초기값 세팅 

        let array = [0, 1, 2, 3]

        let newArray = array.reduce(0) { $0 + $1 }

        print(newArray) //6

        

        let charArray = ["a", "b", "c", "d"]

        let charNewArray = charArray.reduce("result is ") { $0 + $1 }

        print(charNewArray) //result is abcd

 

 

monad : 값이 있을 수도 있고 없을 수도 있는 컨텍스트를 가지는 함수객체타입이며, 함수객체와 모나드는 특정 기능이 아닌 디자인 패턴 혹은 자료구조라고 할 수 있다.

 

context : 옵셔널처럼 값이 옵셔널 타입으로 감싸져있듯이 값을 담는 컨테이너 역할을 하는것

 

함수객체 : 맵을 적용할 수 있는 컨테이너 타입 (array, dictionary, set 등 컬렉션 타입들)

 

FlatMap : map 과 사용법이 같음

컨테이너로 쌓여져있으면 컨테이너 안의 값으로 작업을 수행하여 다시 포장하여 반환

플랫맵은 체인 형식으로 사용 가능하나 맵은 불가능 (optionals.flatMap{ $0 }.flatMap{ $0 })

 

       let optionals: [Int?] = [0, 1, 2, nil, 4]

        let map = optionals.map { $0 }

        let flatMap = optionals.flatMap { $0 }

        

        print(map) // [Optional(0), Optional(1), Optional(2), nil, Optional(4)]

        print(flatMap) //[0, 1, 2, 4]

Comments