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을 시켰다