반응형
대소문자 구분 없이 숫자와 알파벳의 갯수가 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의 갯수들을 모두 확인한다는 점이 다른 것 같네요.
반응형
'Codewars(알고리즘) > 6Kyu' 카테고리의 다른 글
[Codewars] [6Kyu] Consecutive Strings (0) | 2021.03.05 |
---|---|
[Codewars] [6Kyu] How Much? (0) | 2021.03.05 |
[Codewars] [6kyu] Braking well (0) | 2021.03.03 |
[Codewars] [6kyu] Street Fighter 2 - Character Selection (0) | 2021.01.26 |
[Codewars] [6kyu] Duplicate Encoder (0) | 2020.11.01 |