Codewars(알고리즘)/6Kyu

[Codewars] [6Kyu] Counting Duplicates

Dannian 2021. 3. 4. 14:23
반응형
 

Codewars: Achieve mastery through challenge

Codewars is where developers achieve code mastery through challenge. Train on kata in the dojo and reach your highest potential.

www.codewars.com

대소문자 구분 없이 숫자와 알파벳의 갯수가 2개 이상인 것들의 전체 갯수를 리턴하는 문제입니다.

1. Swift

1-1. 본인의 풀이

func countDuplicates(_ s:String) -> Int {
  let lower = s.lowercased()
  return Array(Set(lower)).filter{return lower.firstIndex(of: $0) != lower.lastIndex(of: $0)}.count
}

먼저 입력 받은 문자열 s를 lowercased()를 이용해서 모두 소문자로 바꿔버립니다.(lower라는 변수에 저장)

그 다음 Set함수를 이용해서 lower의 String을 각 문자별로 나눠줍니다. 이 때 Set을 이용하면 type이 Set<Character>로 변경되기 때문에 Array로 감싸서 배열로 바꿔줍니다.

그렇게 변경한 Array를 filter를 이용해서 각 알파벳(또는 숫자)의 첫 번째 인덱스와 마지막 인덱스가 다른 경우를 필터링해줍니다.

첫 번째 인덱스와 마지막 인덱스 값이 다르다면 2개 이상인 값이라고 판단 할 수 있기 때문입니다.

filter를 이용한 이유는 중복값의 제거를 위함입니다.

그렇게 저장된 것들을 count를 하여 반환해줍니다.

그러면 2개 이상인 알파벳과 숫자들의 총 값이 나옵니다.

 

1-2. Best Solution

func countDuplicates(_ s:String) -> Int {
    var counts: [String: Int] = [:]
    for character in Array(s) {
        counts[character.lowercased(), default: 0] += 1
    }
    return counts.values.filter{ $0 > 1 }.count
}

각 Character의 lowercased를 Key로 하는 counts라는 Dictionary를 이용해서 전체 카운트를 구하고, 해당 Dictionary에서 Value가 1 초과인 값들을 filter를 이용해서 새로운 배열을 만들고 그 값들의 count를 구해서 반환하는 것입니다.

제가 만든 것과 다른 점은 Key-Value를 이용해서 모든 Character의 갯수들을 모두 확인한다는 점이 다른 것 같네요.

 

 

 

반응형