오히려 코틀린 코딩테스트로 더 효율적인 코드로 알고리즘을 구현할 수 있지 않을까라는 생각,
게다가 보통 여러 회사들이 자바로 보통 테스트하지 않을까 생각했지만,
오히려 코틀린으로 코테를 보는 곳이 더 안드로이드에 대해 빠삭하지 않을까라는
로너 님의 의견을 듣고 마음이 흔들려 오늘부터 Java에서 코틀린으로 전환하기 했다.
삘타서 오늘 프로그래머스 문제로 5개의 문제를 풀어보았다.
첫 번째 문제는
짝수와 홀수
//짝수와 홀수
class EvenAndOdd {
fun solution(num: Int): String = if (num % 2 == 0) "Even" else "Odd"
}
짝수라면 Even을 홀수면 Odd를 출력하는 문제이다.
간단하게 2로 나누어져 나온 나머지의 값에 따라 출력하였다.
두 번째 문제는
자릿수 더하기
//자릿수 더하기
class EditDigits {
fun solution(n: Int): Int {
var result = 0
for(i in n.toString().toCharArray()) result += (i - '0')
return result
}
}
각 자릿수의 합을 반환하는 문제였는데,
인자로 받은 Int값을 String으로 변환하여,
각 문자열을 문자 배열로 받아 for문으로 돌려 '0' 문자를 빼서
Int로 다시 변환하여 result 변수에 더해 담아 출력하였다.
세 번째 문제는
약수의 합
//약수의 합
class FindAFactor {
fun solution(n: Int): Int {
var count = 0
for(i in 1..n) if(n % i == 0) count += i
return count
}
}
전달받은 인자만큼 for문을 돌리고,
전달받은 인자를 i로 나누었을 때, 나머지가 0인 즉, 약수인 값이 존재할 때,
count에 합을 넣어 마지막에 반환하였다.
네 번째 문제는
평균 구하기
class Average {
fun solution(arr: IntArray): Double {
var sum = 0.0
arr.forEach {
sum += it
}
return sum / arr.size
}
}
해당 문제를 다음과 같이 풀었다.
그런데 이 것보다 더 간결한 코드가 있다.
class Average {
fun solution(arr: IntArray): Double = arr.average()
}
훨씬 간결하다.
코틀린 내부에 내장 함수로 존재하는 IntArray의 평균을 구해주는 average() 메서드이다.
하지만, 난 이 방법을 사용하지 않았다.
이유는 아래와 같다.
처음 코드 즉, 내장 함수를 사용하지 않을 때 코드가 실행되는 속도이다.
그다음은 내장 함수를 사용했을 때 속도이다.
엄청난 속도 차이이다.
왜 이런 결과가 나온 것일까..
혹시나 큰 리소스에서는 avarage 메서드가 훨씬 효율 있게
작동할 수 있는 것이 아닐까 하는 마음에 코드를 작성해보았다.
한번 직접 코드를 돌려보았다.
fun main() {
var intArr = (1..10000000).toList().toIntArray()
unBuiltInFunction(intArr)
builtInFunction(intArr)
}
//내장함수를 사용하지 않을때
fun unBuiltInFunction(intArr: IntArray) {
val before = System.currentTimeMillis()
var sum = 0.0
intArr.forEach {
sum += it
}
println("unBuiltInFunction value : ${sum / intArr.size}")
val after = System.currentTimeMillis()
println("unBuiltInFunction time : ${after - before} m/s")
}
//내장함수를 사용할 때
fun builtInFunction(intArr: IntArray) {
val before = System.currentTimeMillis()
println("builtInFunction value : ${intArr.average()}")
val after = System.currentTimeMillis()
print("builtInFunction time : ${after - before} m/s")
}
내장 함수를 쓸 때와 안 쓸 때 속도를 비교하는 함수를 구성했다.
우선 1에서 5백만까지 int를 배열에 담아 출력하였다.
결과를 보자.
코딩 테스트 결과처럼 여전히 내장 함수를 쓰지 않는 코드가 속도가 더 빠르다.
그렇다면
1에서 천만까지의 int 값을 배열에 담고 실행하면 어떻게 될까?
var intArr = (1..10000000).toList().toIntArray()
이 부분만 코드를 바꾸고 다시 실행해보았다.
허.. 결과는 달라지지 않았다.
정말 이 내부 함수는 간결함을 위해 어느 정도의 효율성을 포기한
메서드인가..라는 생각이 들게 한다.
이 부분에 대해 왜 이렇게 되는지 아시는 분은 댓글로 공유 부탁드립니다.
찝찝한 마음으로 다음에 알아보기로 하고,
다음 문제를 보자.
정수 제곱근 판별
//정수 제곱근 판별
class DetermineTheSquareRootOfAnInteger {
fun solution(n: Long): Long {
val squareRoot = sqrt(n.toDouble()).toLong()
return if(squareRoot * squareRoot == n) (squareRoot + 1).toDouble().pow(2).toLong()
else -1
}
}