Codewars(알고리즘)/7Kyu

[Codewars] [7Kyu] Count the Digit

Dannian 2021. 3. 5. 18:40
반응형
 

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

이번 문제는 n과 d가 입력되고, n을 2제곱 한 값 에서 d가 포함된 갯수를 카운트 하는 문제입니다.

 

1. Swift

1-1. 본인의 풀이

func nbDig(_ n: Int, _ d: Int) -> Int {
  var returnValue: String = ""
  for k in 0 ... n {
    returnValue.append(String(k * k))
  }
  return returnValue.split(separator: Character(String(d)), omittingEmptySubsequences: false).count - 1
}

for문을 통해서 0부터 n까지 값을 제곱한 값을 String으로 바꿔서 returnValue라는 String에 append시킵니다.

0부터 n까지 하는 이유는 문제상에 주어진 조건 중에서 n >= 0 이라는 조건이 있기 때문입니다.

마찬가지로 d 또한 0 <= d <= 9라는 조건이 주어집니다.

n까지 2제곱을 한 값을 returnValue에 append한 후, 해당 String을 split시키는데, separator의 조건은 d값에 해당합니다. 그리고 omittingEmptySubsequences를 false로 주어 빈 array가 나오는 경우에도 반환하도록 합니다.

이렇게 하면 예를 들어 014916의 경우 1로 separator를 진행하면 0, 49, 6이 나옵니다.

이 결과값에 -1을 하여 반환하면 contain갯수를 확인할 수 있게 됩니다.

 

1-2. Best Solution

func nbDig(_ n: Int, _ d: Int) -> Int {
    return (0...n).map{"\($0 * $0)".filter { $0 == Character("\(d)")}}.flatMap { $0 }.count
}

이 경우는 0 부터 n까지 값을 갖는 배열을 생성하고 map을 이용해서 제곱한 값을 String으로 만듭니다("\($0 * $0)").

그 후 해당 값에 대해 filter를 진행하는데, 각 Character의 값 중에서 d와 일치하는 것을 걸러내는 것입니다.

그 결과를 만들어내는 것 까지가 map이고, 결과물은 String Array가 될 것입니다.

해당 String Array에 들어있는 것들은 빈 값이거나 d에 해당하는 Character들로만 이루어진 String이 될 것이고요.

그것을 flatMap을 이용해서 빈 값을 제거하고 2개 이상의 d가 포함되어있는 String을 따로 나누어줍니다.

그 후 count를 하면 d가 포함된 값만 count가 됩니다.

 

반응형

'Codewars(알고리즘) > 7Kyu' 카테고리의 다른 글

[Codewars] [7Kyu] ToLeetSpeak  (0) 2021.03.04
[Codewars] [7Kyu] Sum of odd numbers  (0) 2021.03.04