알고리즘 문제 풀이/백준

[Algorithm] 백준 - 숫자의 개수 (2577) (Kotlin)

참깨빵위에참깨빵_ 2024. 6. 6. 18:58
728x90
반응형

 

먼저 장황하게 풀면 아래와 같다.

 

fun main() {
    val list = arrayListOf<Int>()
    repeat(3) {
        list.add(readln().toInt())
    }
    val reduceNum = list.reduce { acc, i -> acc * i }
    val intArr = Array(10) { 0 }
    reduceNum.toString().mapIndexed { index: Int, c: Char ->
        when (c) {
            '0' -> intArr[0] += 1
            '1' -> intArr[1] += 1
            '2' -> intArr[2] += 1
            '3' -> intArr[3] += 1
            '4' -> intArr[4] += 1
            '5' -> intArr[5] += 1
            '6' -> intArr[6] += 1
            '7' -> intArr[7] += 1
            '8' -> intArr[8] += 1
            '9' -> intArr[9] += 1
        }
    }
    intArr.forEach {
        println(it)
    }
}

 

작동은 하지만 너무 장황하다. 어떻게 개선할 수 있을까?

 

fun main() {
    val numbers = List(3) { readln().toInt() }
    val product = numbers.reduce { acc, i -> acc * i }
    val intArr = IntArray(10)

    product.toString().forEach { char ->
        intArr[char.digitToInt()]++
    }

    intArr.forEach(::println)
}

 

입력받은 숫자를 리스트에 담는 로직이 다르다. 리스트를 선언하는데 크기는 3이고, 입력받은 값을 숫자로 바꿔서 넣는다.

모든 숫자를 곱해야 하기 때문에 reduce를 사용하는 것과 크기가 10인 정수 배열을 선언하는 것은 동일하다. 그러나 이후 숫자의 등장횟수를 세는 로직이 많이 바뀌었다.

digitToInt()를 사용하고 있는데, 이 함수는 아래와 같은 역할을 한다.

 

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/digit-to-int.html

 

digitToInt - Kotlin Programming Language

 

kotlinlang.org

이 char가 나타내는 십진수를 리턴한다. char가 유효한 십진수가 아니라면 예외가 발생한다. char에 대해 isDigit이 true면 char는 십진수를 나타내는 것으로 간주된다. 이 경우 char의 유니코드 십진수 값이 리턴된다

 

즉 0~9의 char를 0~9로 변환한다. 그래서 정수 배열에서 각 숫자의 올바른 인덱스에 접근해 1을 더함으로써, 숫자 별 등장횟수를 체크할 수 있다.

체크가 완료되면 정수 배열을 세로로 출력한다. 출력 방식을 메서드 참조 방식으로 바꿨다. 메서드 참조를 모른다면 검색해서 확인해 보자.

반응형