프로그래머스

[프로그래머스][Kotlin]소수 찾기

끝까지 처음처럼 2023. 3. 30. 12:57
728x90

해당 문제는 입력받은 numbers의 숫자를 조합하여 만들 수 있는 숫자들 중 소수인 숫자들의 개수를 반환하는 문제입니다.
저는 numbers를 내림차순으로 정렬했을 경우 가장 큰 수가 나오는 점을 이용하여 가장 큰 수만큼의 사이즈를 가진 배열을 생성 후 유클리드 호제법을 이용하여 소수인지 구분하는 배열을 미리 만들어 놓은 다음 numbers를 완전 탐색하며, 현재 조합 된 숫자가 소수인지 확인 후 소수가 맞다면 list에 저장한 후 최종적으로는 list의 사이즈를 반환하는 형식으로 코드를 작성하였습니다.
 
하기는 작성한 코드와 실행 결과 입니다.

class Solution {
    var list = ArrayList<Int>()
    var number : Int = 0
    var numbers = ""
    lateinit var visit : BooleanArray
    lateinit var check : IntArray
    fun solution(numbers: String): Int {
        number = numbers.toCharArray().sortedDescending().joinToString("").toInt()
        visit = BooleanArray(numbers.length){true}
        this.numbers = numbers
        check = IntArray(number+1){i: Int -> i}
        for(i in 2 .. Math.sqrt(check.size.toDouble()).toInt()){
            var start = i
            if(check[start] == 0) continue
            while(start+i < check.size){
                start+=i
                check[start] = 0
            }
        }

        for(i in 0 .. numbers.length-1){
            visit[i] = false
            join(numbers[i].toString())
            visit[i] = true
        }

        return list.distinct().size
    }
    fun join(s:String){
        if(check[s.toInt()] != 0 && s.toInt() != 1){
            list.add(s.toInt())
        }
        for(i in 0 .. numbers.length-1){
            if(visit[i]){
                visit[i] = false
                join(s+numbers[i].toString())
                visit[i] = true
            }
        }
    }
}
테스트 1 통과 (39.16ms, 65.3MB)
테스트 2 통과 (69.43ms, 68.6MB)
테스트 3 통과 (44.86ms, 65.8MB)
테스트 4 통과 (66.01ms, 66.9MB)
테스트 5 통과 (119.69ms, 83.4MB)
테스트 6 통과 (41.04ms, 65.5MB)
테스트 7 통과 (36.66ms, 64.7MB)
테스트 8 통과 (146.58ms, 94MB)
테스트 9 통과 (41.21ms, 65.3MB)
테스트 10 통과 (75.18ms, 69.5MB)
테스트 11 통과 (46.04ms, 65.5MB)
테스트 12 통과 (51.99ms, 65.9MB)