달달한 스토리

728x90
반응형

지금껏 Java로만 코딩 테스트를 풀었지만,

 

안드로이드 개발할때 코틀린만 쓰기도 하고,

 

오히려 코틀린 코딩테스트로 더 효율적인 코드로 알고리즘을 구현할 수 있지 않을까라는 생각,

 

게다가 보통 여러 회사들이 자바로 보통 테스트하지 않을까 생각했지만,

 

오히려 코틀린으로 코테를 보는 곳이 더 안드로이드에 대해 빠삭하지 않을까라는

 

로너 님의 의견을 듣고 마음이 흔들려 오늘부터 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
    }
}

해당 문제는 제곱근(squareRoot)을 구해야 풀 수 있는 문제였다.

 

Math class를 import 하고 double형태에 값의 제곱근을 구해주는

 

sqrt메서드를 이용하여 제곱근을 구했고,

 

이 제곱근 제곱하면 n의 값과 같은 확인하고,

 

맞다면, 제곱근의 1을 더하고 제곱을 위한 pow함수를 쓰기 위해,

 

double로 변환하고 마무리로, 소수점을 없애기 위해 long 타입으로 변환하여

 

마무리하였다.

 

 

오늘 이렇게 코틀린으로 처음 코딩 테스트를 풀어봤는데, 자바보다

 

훨씬씬 간결하고 표현하기 훨 수월했다.

 

앞으로 재밌게 코딩 테스트할 일만 남았다.

728x90
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading