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 |