곽로그

[백준 4673] 셀프 넘버 본문

알고리즘/백준

[백준 4673] 셀프 넘버

일도이동 2019. 4. 18. 13:17
반응형

 

 

4673번: 셀프 넘버

문제 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다.  예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는

www.acmicpc.net

접근법

불린배열을 생각했다. n을 입력해서 d(n)을 구한다. 그러면 불린배열에서 인덱스가 d(n)인 요소의 값을 true로 바꾼다. (불린 배열을 선언하면 fasle로 초기화 되기 때문이다) 따라서 위의 작업이 다 끝난 후에 배열의 값이 false인 인덱스 값을 출력하면 그것이 셀프넘버가 된다. 

 

주의점

 여기서 d(n)을 구하는 함수를 어떻게 정의할 것인지가 중요한데, 처음에는 if-else를 이용해서 2자리일 때, 3자리일 때, 4자리 일때를 나눠서 d(n)의 값을 구했다. 그것보다 더 간단한 코드는 while문을 이용해서 10으로 나눈 나머지를 더해가는 방법이다. 

 

public class Main {
	public static int noSelfNumber(int num) {
		int newN=num;
		while(num>0) {
			newN+=num%10;
			num/=10;
		}
		return newN;
		
	}
	public static void main(String[] args) {
		boolean[] noSelfNumberA=new boolean[10000]; 
		//배열을 선언하면 false로 초기화 되기 때문에 헷갈리지 않게 배열의 이름에 no를 붙임
		
		for(int i=0;i<noSelfNumberA.length;i++) {
			if(noSelfNumber(i)<10000) {
				noSelfNumberA[noSelfNumber(i)]=true;
			}
			
		}
		
		for(int i=1;i<noSelfNumberA.length;i++) {
			if(!noSelfNumberA[i]) {
				System.out.println(i);
			}
		}
		
		
		
	}
}
 	
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2577] 숫자의 개수  (0) 2019.04.22
[백준 1065] 한수  (0) 2019.04.19
[백준 1110] 더하기 사이클  (0) 2019.04.18
[백준 4344] 평균은 넘겠지  (0) 2019.04.17
[백준 1546] 평균  (0) 2019.04.17
Comments