Codewars(알고리즘)/6Kyu

[Codewars] [6kyu] Duplicate Encoder

Dannian 2020. 11. 1. 21:28
반응형
 

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개 이상이 나오는 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: "")
}
 

Apple Developer Documentation

 

developer.apple.com

 

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으로 반환 한 것이 다를 뿐입니다.

 

-차후 다른 언어의 풀이도 추가될 예정입니다.-

 

반응형