본문 바로가기

알고리즘(w.KOTLIN)/함수

[BOJ][4673] 셀프 넘버

728x90

https://www.acmicpc.net/problem/4673

 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

문제 풀이

1. n의 생성자 = n + n의 각 자리수의 합

2. 입력이 없고 1부터 10000까지의 숫자에 대해서 반복문을 통해서 각 숫자가 셀프 넘버인지 확인 한다.

3. 2번에서 확인하는 숫자 만큼 반복 탐새을 하면서 각 자리 수의 합을 4번 과정에서 구한다.

4. 각 자리 수의 합을 구하는 알고리즘을 적용

ex> 125 의 각 자리수 합 구하기
아래의 과정을 몫이 0이 될때 까지 반복하여 각자리 수의 합을 구한다.

125 / 10  => (몫)12 (나머지)5 -> 나머지를 일의 자리수로 저장
위의 몫으로 나온 값으로 위의 수식 반복
12  / 10  => (목)1  (나머지)2 -> 나머지를 십의 자리수로 저장
1   / 10  => (몫)0  (나머지)1 -> 나머지를 백의 자리수로 저장

 

5. 3번 + 4번의 합이 2번의 입력된 숫자와 같으면 셀프 넘버가 아니므로 다음 숫자를 탐색 한다

코드

import java.io.*

fun main(args: Array<String>) {
    // 셀프넘버를 저장하는 리스트
    val result = mutableListOf<Int>()

    // 주어진 조건의 1부터 10000까지의 숫자를 탐색한다.
    for (n in 1..10000) {
        if (checkSelfNumber(n)) result.add(n)
    }
    
    result.forEach { r ->
        println(r)
    }
}

fun checkSelfNumber(n: Int): Boolean {
    // 입력되는 숫자 만큼 1부터 탐색하여 생성자가 존재하는 지 확인 한다.
    for (i in 1..n) {
        var sum = i
        var number = i
        while (number != 0) {
            sum += number % 10
            number = number / 10
        }
        
        // sum 과 주어진 입력 n이 같으면 생성자가 존재하므로 다음 반복을 하지 않고
        // 결과를 리턴한다.
        if (sum == n) return false
    }
    
    return true
}

 

 

728x90