이번 문제는 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] V A P O R C O D E (0) | 2024.11.30 |
---|---|
[Codewars] [7Kyu] Highest and Lowest (0) | 2024.11.30 |
[Codewars] [7Kyu] ToLeetSpeak (0) | 2021.03.04 |
[Codewars] [7Kyu] Sum of odd numbers (0) | 2021.03.04 |