[프로그래머스] 유한소수 판별하기

Sdoubleu·2023년 6월 1일
0

프로그래머스

목록 보기
31/34
post-thumbnail

문제


내가 쓴 풀이

  • 첫 번째 풀이
fun gcd(a: Int, b:Int): Int = if(b != 0) gcd(b, a % b) else a

fun main() {
    var a = 12
    var b = 21
    var gcdnum = gcd(a,b)

    var b2 = b / gcdnum
    val mut = mutableListOf<Int>()
    
    var answer = 0 

    while(b2 != 1){
        for(i in 2..b2){
            if(b2 % i == 0) {
                mut.add(i)
                b2 /= i
            }
        }
    }
    
    if(mut.filter { it != 2 && it != 5}.isEmpty()) answer = 1 else answer = 2
    
    return answer
}

분모를 최대 공약수로 나눠서 기약 분수로 나눈 다음에
b2 가 1이 될 때까지 약수들을 구한 것들을 mut 에 집어넣었고
filter를 사용해서 2와 5가 없다면 무한 소수가 되는 것이고
있다면 유한 소수가 되는 것이라고 생각하고 코드를 짰는데

10초가 넘어버리는 런타임 에러로 인해서 불상사가 생겼다
while문 안에 for문으로 인해서 런타임 오류가 생긴 것 같다...😢


  • 두 번째 풀이
class Solution {
    fun solution(a: Int, b: Int): Int {
        var gcdNum = gcd(a,b)
        var b2 = b / gcdNum
        
        while(b2 != 1){
            if( b2 % 2 == 0) b2 /= 2 else if( b2 % 5 == 0) b2 /= 5 else return 2
        }
        
        return 1
    }
}

fun gcd(a: Int, b: Int): Int = if(b != 0 ) gcd(b, a % b) else a

이번엔 분모가 1이 될 때 까지 2와 5로 나눠주는데
문제가 없다면 1을 return하고 2와 5가 아닌 수로 나눌 수 있다면 2를 return 한다


다른 사람 풀이

class Solution {
    fun solution(a: Int, b: Int): Int {
        return primeFactor(b / gcd(a, b)).find { it != 2 && it != 5 }?.run { 2 } ?: 1
    }

    private fun primeFactor(num: Int): List<Int> {
        val list = mutableListOf<Int>()
        var mutableNum = num
        var divisor = 2

        while (mutableNum > 2) {
            if (mutableNum % divisor == 0) {
                list.add(divisor)
                mutableNum /= divisor
            } else {
                divisor++
            }
        }
        return list
    }
}

tailrec fun gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b)

내가 했던 첫 번째 풀이의 개선 코드라고 생각한다 ...
for문을 없애고 프로퍼티로 값을 나눈 다음 mutableList에 넣었다

내가 사용한 filter와 다르게 find 함수를 통해서 값을 찾은 다음 return을 시켰다

profile
개발자희망자

0개의 댓글