Programmers Scala Study (level 2.5)

5. 소수 찾기

문제 설명

숫자가 적힌 문자열을 조합해서 만들수 있는 소수의 개수를 구하시오.

Inputs

Variable Name type meaning
numbers String numbers on note

output

return Int // number of prime numbers can be made with "numbers"

Conditions

  • numbers
    • lenght: 1~7
    • values → number: 0~9
    • eg) “013” → means number can be built with 0, 1 and 3
    • eg) “011” = “11”

Test cases

numbers return
“17” 3
“011” 2

Solution

Idea1

퍼뮤테이션으로 인덱스번호들을 생성하고, 해당 인덱스의 숫자들을 numbers에서 가져옴.

조합한 숫자를 toNum한 뒤에 소수인지 확인.

def isPrime(num: Int): Boolean = {
  if (num <= 1) false
  else if (num == 2) true
  else !(2 to (num-1)).exists(x => num % x == 0)
}
def solution(numbers: String): Int = {
  return (1 to numbers.length)
  .map(cnt => numbers.combinations(cnt).toVector)
  .flatten
  .map(opts => opts.toString.permutations.toVector)
  .flatten
  .map(num => num.toInt)
  .toSet.toVector
  .map(num => isPrime(num))
  .count(v => v == true)
}

성공! XD

Study from Implementation

  • Iterable에서 유용한 함수 두개
    • permutations
    • combinations
      • 파라미터로 개수를 넘기면 해당 개수로 골라서 수행한다.
    • 그냥 리스트나 벡터 뒤에 해당 메소드를 달기만 하면 생성된다.