알고리즘(w.KOTLIN)/함수
[BOJ][4673] 셀프 넘버
금님은님아부지
2022. 10. 21. 15:49
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