Hope Everyone Is Happy

[실버5] 4673. 셀프 넘버 (Java) 본문

※ 백준 (Baekjoon)/[Java] 문제 풀이 ( Solve the problems)

[실버5] 4673. 셀프 넘버 (Java)

J 크 2023. 7. 27. 22:54
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

알고리즘 푸는 것도 재밌지만 곧 사이드 프로젝트도 진행 하도록 하겠습니다..!


 해당 문제는 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! (피드백 고맙습니다)