[실버5] 4673. 셀프 넘버 (Java)
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
알고리즘 푸는 것도 재밌지만 곧 사이드 프로젝트도 진행 하도록 하겠습니다..!
해당 문제는 1949년 인도 수학자 D.R Kaprekar 님께서 이름을 붙인 셀프 넘버라는 규칙을 이용한 문제입니다.
셀프 넘버 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의 했을 떄 ( Ex d(75) = 75 + 7 + 5 = 82 ) 해당 규칙을 통해, n, d(n), d(d(n)).... 등의 순서로 무한히 수열을 만들 수 있다고 가정 합니다. ex) 33 + 3 = 39 이고 그 다음 수 는 51 + 5 +1 = 57 이런 식으로 수열을 만들면 33, 39, 51, 57, 69, 84...으로 가정한다고 보시면 될 것 같습니다.
이렇게 가정했을 때 n을 d(n)의 생성자라고 가정합니다. 예를 들면, 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자입니다. 생성자가 한 개보다 많은 경우도 있습니다! 예를 들어, 101은 생성자가 2개가 있네요! -> 91 (91 + 9 + 1)과 100 (100 + 1 + 0 + 0).
이 떄 생성자가 없는 숫자를 셀프 넘버라고 합니다. 이 규칙을 이용해 10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력합니다.
Example :
◈ 100 보다 낮은 수 중 셀프 넘버
1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97
◈ Output ( 10000 보다 작은 셀프 넘버 )
1
3
5
7
9
20
31
42
53
64
|
| <-- a lot more numbers
|
9903
9914
9925
9927
9938
9949
9960
9971
9982
9993
저 같은 경우는 boolean 배열을 활용하여, 셀프 넘버가 아닌 경우는 true로 체크하여 코드를 작성하였습니다.
코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.
▶ 1부터 10000까지의 수를 받아, 셀프 넘버에 해당되지 않는 수를 인덱스로 받는 boolean 배열을 true로 변경
▶ 셀프 넘버 계산은 1부터 10000 까지 각 수와 각 자리수의 숫자를 더하여 계산.
public class Solution {
public static void main(String[] args) {
// TODO Auto-generated method stub
boolean[] bArr = new boolean[10000];
for(int i = 1; i < 10000; i++) {
int nTemp = i;
int nSum = i;
while(nTemp > 0) {
nSum += nTemp % 10;
nTemp /= 10;
}
if(nSum < 10000)
bArr[nSum] = true;
}
for(int j = 1; j < 10000; j++) {
if(!bArr[j])
System.out.println(j);
}
}
}
오늘은 코드 보다 문제 설명이 더 길었네요!! 일정이 있다보니 비교적 간단하게 풀려고 골랐는데 생각보다 시간이 걸렸습니다. 억울쓰..
긴 글 읽어주셔서 감사합니다!
Good Luck! (피드백 고맙습니다)