본문 바로가기

Swift Algorithms

4. Most Common Name in Array

4. Most Common Name in Array

딕셔너리 배열을 통해 가장 많이 등장하는 이름을 찾는 알고리즘

 

func mostCommonNameInArray (_ array : [String]) -> String {

    var nameCountDictionary = [String : Int]()

    for name in array {
        if let count = nameCountDictionary[name] {
            nameCountDictionary[name] = count + 1
        }else {
            nameCountDictionary[name] = 1
        }

    }

    var mostCommonName = ""

    for key in nameCountDictionary.keys {

        if mostCommonName == "" {
            mostCommonName = key
        }else{
            let count = nameCountDictionary[key]
            if count! > nameCountDictionary[mostCommonName]! {
                mostCommonName = key
            }
        }
        print("\(key) : \(nameCountDictionary[key]!)")
    }


    return mostCommonName
}

mostCommonNameInArray(["Sally", "Sam", "Bob", "Michael", "Bob"])

 

namenameCountDictionary라는 빈 딕셔너리 배열을 만든 후 namenameCountDictionary의 딕셔너리 키 값에  "Sally", "Sam", "Bob", "Michael", "Bob"을 for in 구문을 통해 키 값으로 넣어주고 벨류 값으로는 1을 넣어주고 만약 같은 키 값이 중복될 경우 값에 +1을 해줍니다.

if 구문에서 count를 옵셔널 바인딩 처리해주고 있습니다. namenameCountDictionary는 지금 빈 딕셔너리기 때문에 ["Sally", "Sam", "Bob", "Michael", "Bob"]의 처음 들어가는 키 값은 nil을 리턴하고 else구문이 실행되고 값은 1이 들어갑니다. 만약 한번 들어간 키값이 다시 올 경우 이미 값으로 1이 들어가 있기 때문에 nil을 반환하지 않고 값 1을 반환합니다. 이럴 경우 nil이 아니기 때문에 if 구문을 실행하고 값인 카운트 1 + 1을 실행하고 값은 2가 됩니다.

 

func mostCommonNameInArray (_ array : [String]) -> String {

    var nameCountDictionary = [String : Int]()

    for name in array {
        if let count = nameCountDictionary[name] {
            nameCountDictionary[name] = count + 1
        }else {
            nameCountDictionary[name] = 1
        }

    }
    
mostCommonNameInArray(["Sally", "Sam", "Bob", "Michael", "Bob"])

 

위에서 담았던 키 값 Sally", "Sam", "Bob", "Michael", "Bob"을 for in 구문을 통해 값을 확인하고 가장 벨류가 높은 이름이 키가 가장 많이 이름이 있는 키값이 됩니다.

일단 mostCommonName이라는 빈 문자열 변수를 만들고 만약 변수의 문자열이 비어있다면 mostCommonName의 변수와 키 값이 같습니다. 딕셔너리는 정렬되어있지 않은 배열이기 때문에 아무런 키 하나가 들어갑니다. mostCommonName에는 랜덤 키하나가 들어갑니다.(이해를 위해 "Sally"가 들어갔다는 예시)

if 구문이 실행됐으니 다시 처음 for in 구문으로 돌아갑니다. 다음 키가 들어오고 (이해를 위해 "Sam"이 들어갔다는 예시) mostCommonName은 방금 전 랜덤 키("Sally") 하나가 들어갔기 때문에 더 이상 빈 배열이 아니게 됨으로 else구문이 실행됩니다. 새롭게 들어온 키("Sam")의 값은 count에 저장되고 (값 1) 만약 상수 카운트의 값이 처음 들어온 키("Sally")의 값보다 크다면 mostCommonName은 새로 들어온 키 값으로 대체됩니다.

이와 같은 과정을 반복하면 처음 들어온 키 값("Sally") 보다 큰 값이 있다면  mostCommonName = key를 통해 더 큰 값을 가지고 있는 키로 대체되고 다시 다른 키의 값들과 비교하게 됩니다.

 

    var mostCommonName = ""

    for key in nameCountDictionary.keys {

        if mostCommonName == "" {
            mostCommonName = key
        }else{
            let count = nameCountDictionary[key]
            if count! > nameCountDictionary[mostCommonName]! {
                mostCommonName = key
            }
        }
        print("\(key) : \(nameCountDictionary[key]!)")
    }


    return mostCommonName
}

mostCommonNameInArray(["Sally", "Sam", "Bob", "Michael", "Bob"])

 

'Swift Algorithms' 카테고리의 다른 글

6. Fibonacci Sequence  (0) 2020.07.03
5. Reverse every other word  (0) 2020.07.03
3. Factorials & Recursion  (0) 2020.06.23
2. Binary Search  (0) 2020.06.23
1. Fizz Buzz  (0) 2020.06.22