Codewars(알고리즘)/5Kyu

[Codewars] [5Kyu] Consecutive k-Primes

Dannian 2024. 11. 30. 15:40
반응형
 

Codewars - Achieve mastery through coding practice and developer mentorship

A coding practice website for all programming levels – Join a community of over 3 million developers and improve your coding skills in over 55 programming languages!

www.codewars.com

이번 문제는 소인수분해를 해서 나온 소수들의 갯수를 확인하고, k 값과 동일한 소수의 갯수가 연속되는 횟수에 대해서 구하는 문제입니다.

 

1. Swift

1-1. 본인의 풀이

소인수분해를 하는 함수를 하나 만들고(primeCountChecker) 해당 함수에서 반환하는 값을 비교해서 k와 동일한 값이 연속해서 반환되는 횟수를 구했습니다.

func consecKprimes(_ k: Int, _ arr: [Int]) -> Int {
    // your code
  var returnValue: Int = 0
  var isContinue: Bool = false
  for element in arr {
    let test = primeCountChecker(element)
    guard test == k else {
      if isContinue { 
        isContinue = false
      }
      continue
    }
    if isContinue == false {
      isContinue = true 
    } else {
      returnValue += 1
    }
    
  }
  return returnValue
}

func primeCountChecker(_ n: Int) -> Int {
  var num = n
  var result: [Int] = []
  var count = 2
  while num != 1 {
    if num % count == 0 {
      num = num / count
      result.append(count)
      count = 2
    } else {
      count += 1
    }
  }
  return result.count
}

primeCountChecker의 동작은 나머지가 0인 값이 나오면 해당 값으로 나눈 결과물을 num에 저장하고, 그 값을 다시 2부터 차례로 나누게 하는 식입니다.

해당 함수에서 result 배열에는 소수들이 들어있습니다.

 

1-2. Best Solution

Best Practices를 받은 문제풀이입니다.

func consecKprimes(_ k: Int, _ arr: [Int]) -> Int {
    
    func prim(_ n: Int) -> Int {
        var na = n, i = 2, cn = 0
        while na > 1 { while na % i == 0 { cn += 1; na /= i }; i += 1 }
        return cn
    }
    
    var i = 0, cn = 0
    while i < arr.count - 1 {
        if (prim(arr[i]) == k) && (prim(arr[i + 1]) == k)
        {cn += 1}
        i += 1;
    }
    
    return cn
}

동작의 원리 자체는 비슷하지만, 훨씬 간략하게 작성했네요.

 

알고리즘을 풀다보면 언제나 간략하게 작성하는 사람들을 보게되는데, 항상 신기하게 느껴집니다..

반응형