2개 이상이 나오는 character는 ")"로, 그 외는 "("로 치환하는 문제입니다.
1. Swift
1-1. 본인의 풀이
입력된 단어를 일단 소문자로 모두 바꾸고, 각 character의 첫번째 인덱스 값과 마지막 인덱스 값이 동일한지 여부를 판단해서 인덱스가 동일하면 한 개만 존재하는 character, 그 외는 2개 이상이 존재하는 character라고 판단하고 각각에 맞는 괄호 모양을 반환하는 map을 만듭니다.
그 후 map의 반환형은 Array이기 때문에, Array를 String으로 반환하기 위해 Joined함수를 사용합니다.
func duplicateEncode(_ word: String) -> String {
return word.lowercased().map {
return word.lowercased().lastIndex(of: $0) == word.lowercased().firstIndex(of: $0) ? "(" : ")";
}.joined(separator: "")
}
1-2. Best Solution
이번 문제의 경우 Best Practices를 많이 받은 답변과 Clever를 많이 받은 답변이 나누어져 있습니다.
먼저 Best Practices를 많이 받은 답입니다.
func duplicateEncode(_ word: String) -> String {
var dict = [Character: Int](), word = word.lowercased()
for letter in word { dict[letter, default: 0] += 1 }
return word.map { dict[$0]! > 1 ? ")" : "(" }.joined()
}
먼저 빈 Dictionary를 생성 및 parameter로 받은 word를 새로운 수정 가능한 word 변수에 대문자를 모두 소문자로 치환하여 저장합니다.
그 후 word의 각 character를 for문을 이용해서 dict에 Key Value로 저장합니다.
이 때 동일한 Key값(character)가 있다면 Value값이 1이 아닌 다른 숫자가 나오게 될 것입니다.
return에서 word의 character를 이용해서 map을 해줍니다.
이 때 미리 저장해둔 dictionary의 Key 값과 character가 동일하기 때문에, 해당 Key의 Value가 1보다 큰지 여부를 통해 ")"와 "("를 나눠서 반환하고, 그 후 Array를 String으로 반환하기 위해 joined함수를 사용합니다.
여기서는 Index가 아닌 각 Character의 갯수를 Dictionary에 Key와 Value형태로 저장하고, 그 값들을 통해 단어를 치환하여 만들었습니다.
다음은 Clever를 많이 받은 답입니다.
func duplicateEncode(_ word: String) -> String {
let lowercasedWord = word.lowercased()
return String(lowercasedWord.map{lowercasedWord.firstIndex(of: $0) == lowercasedWord.lastIndex(of: $0) ? Character("(") : Character(")")})
}
이 경우는 결국 저와 동일한 방식입니다.
다만 lowercasedWord라는 변수로 새로 저장을 한 것과, Joined함수를 이용해서 String으로 반환 한 것이 아닌 String()으로 감싸서 Array결과값을 String으로 반환 한 것이 다를 뿐입니다.
-차후 다른 언어의 풀이도 추가될 예정입니다.-
'Codewars(알고리즘) > 6Kyu' 카테고리의 다른 글
[Codewars] [6Kyu] Consecutive Strings (0) | 2021.03.05 |
---|---|
[Codewars] [6Kyu] How Much? (0) | 2021.03.05 |
[Codewars] [6Kyu] Counting Duplicates (0) | 2021.03.04 |
[Codewars] [6kyu] Braking well (0) | 2021.03.03 |
[Codewars] [6kyu] Street Fighter 2 - Character Selection (0) | 2021.01.26 |