알고리즘 문제 풀이

프로그래머스 - 소수 찾기

블린더르 2020. 9. 2. 21:30
import kotlin.test.assertEquals

/*
 * 2020-09-02
 * https://programmers.co.kr/learn/courses/30/lessons/42839
 */

class FindPrimeNumber {
    fun solution(numbers: String): Int {
        val numberValues = numbers.map { it.toString() }
        val numbersGroup = numbers.groupBy { it }
        val numberList = ArrayList<String>()
        val newNumberList = ArrayList<String>()

        for (i in 0 until numbers.count()) {
            if (numberList.isEmpty()) {
                numberValues.forEach {
                    numberList.add(it)
                }
            } else {
                numberList.forEach { n ->
                    newNumberList += numberValues.map { v ->
                        n + v
                    }
                }
                numberList += newNumberList
            }
        }

        return numberList.filter { s ->
            s.groupBy { it }.all {
                it.value.count() <= numbersGroup[it.key]?.count() ?: 0
            } && isPrime(s.toInt())
        }.map { it.toInt() }.toSet().count()
    }

    private fun isPrime(num: Int): Boolean {
        if (num <= 1)
            return false
        if (num == 2)
            return true

        if ((num % 2) == 0)
            return false

        var i = 3

        while (i * i <= num) {
            if (num % i == 0)
                return false
            i++
        }
        return true
    }
}

fun main(args: Array<String>) {
    listOf(Pair("011", 2), Pair("17",3), Pair("2",1)).forEach {
        assertEquals(it.second, FindPrimeNumber().solution(
            it.first
        ))
    }
}
반응형