본문 바로가기
IT

[알고리즘] 프로그래머스 k진수에서 소수 개수 구하기 Kotlin

by Diane_KIM 2022. 10. 2.

문제 출처 :https://programmers.co.kr/learn/courses/30/lessons/92335

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

해결방법

1. convert 함수를 통해 전달받은  n 값을  k진수로 변환한다.

2. 전달받은 값을 "0"으로 나누어 list를 만든다음

3. 리스트의 값을  isPrime 함수를 통해 소수인지 확인해서, 소수이면 answer값을 더해준다.

 

issue

1, 11 테스트 케이스에서 런타임 에러가 났는데, 소수값인지 확인하는 함수에서 주어진 값이 너무 커서 런타임 오류가 난것.

기존에는 2에서 소수인지 확인하는 숫자까지 하나씩 값을 확인해 나누어 떨어지면 소수가 아님을 확인했지만, sqrt 값을 이용해 2부터 해당 숫자의 제곱근까지만 확인하니 런타임에러가 나지 않고 잘 돌아갔다.

import kotlin.math.sqrt

class Solution {
    fun solution(n: Int, k: Int): Int {
        var answer = 0

        convert(n, k).split("0").forEach {
            if (it.isNotBlank() && isPrime(it.toLong())) {
                answer++
            }
        }
        return answer
    }

    fun convert(n: Int, k: Int): String {
        val converting = StringBuilder("")
        var quotient = n
        do {
            converting.append(quotient % k)
            quotient /= k
            if (quotient < k) {
                converting.append(quotient)
            }
        } while (quotient >= k)
        return converting.reverse().toString()
    }

    fun isPrime(num: Long): Boolean {
        if (num <= 1) return false

        (2..sqrt(num.toDouble()).toLong()).forEach {
            if (num % it == 0L) return false
        }
        return true
    }
}

 

nice

나는 어렵게 어렵게 받은 숫자값을 하나씩 나누면서  k진수 값으로 변환을 했는데, toString으로 그냥 변환할 수 있었다....!

n값을 k진수로 변환하는 방법 =>  n.toString(k)

WOW