본문 바로가기

TIL/Algorithm

Java 백준 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이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런 식으로 다음과 같은 수열을 만들 수 있다.

33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...

n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다. 생성자가 한 개보다 많은 경우도 있다. 예를 들어, 101은 생성자가 2개(91과 100) 있다. 

생성자가 없는 숫자를 셀프 넘버라고 한다. 100보다 작은 셀프 넘버는 총 13개가 있다. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97

10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

입력

입력은 없다.

출력

10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.

 


첫 번째로는 숫자 num을 매개변수로 받아서 

해당 숫자 + 그 숫자를 이루는 각 숫자들의 합을 리턴해주는 함수를 만들었다 (d 함수)

 

합계를 누적할 int형 sum을 입력받은 num값으로 초기 설정을 하고,

while문을 돌려서 num이 0이 아닐 때까지

계속해서 일의 자리를 추출해 sum에 누적시키고 10으로 나눠주게 하였다

 

이렇게 함수를 들고 나서 main에서는

 

지문에 나온 10000 이하까지의 숫자를 체크하는 것이기 때문에

10000도 포함되어야 하므로 1을 더한 10001개의 boolean타입 chk를 선언하였고

 

반복문을 10000까지 돌리면서 이전에 만든 d 함수를 통해 

셀프 넘버가 아닌 값들을 true로 바꿔주는데

이때, 10001을 넘어가는 숫자를 걸러주기 위해 If 조건문으로 위의 코드와 같이 처리하였다

 

그러면, 셀프 넘버인 숫자들이 true로 바뀌어 있을 것이고,

이제는 반복문을 통해 false 값들만 StringBuilder에 값을 담고

출력해주면 된다.

반응형

'TIL > Algorithm' 카테고리의 다른 글

Java 백준 11654번 문제  (0) 2021.10.01
Java 백준 1065번 문제  (0) 2021.09.30
Java 백준 4344번 문제  (0) 2021.09.28
Java 백준 8958번 문제  (0) 2021.09.27
Java 백준 1546번 문제  (0) 2021.09.26