[백준 4673번/ 함수] "셀프 넘버" 자바를 이용해서 풀기

[백준 4673번/ 함수] "셀프 넘버" 자바를 이용해서 풀기

반응형

이번에 백준 4673번 단계 별로 풀어보기

함수 섹션에 "셀프 넘버" 문제를 풀어봤습니다.

여태껏 문제들을 풀면서 자바의 문법적인 면에서

막힌 적은 있었으나, 이번 문제는 문제 자체가

어려웠습니다. ㅠㅠ

https://www.acmicpc.net/problem/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보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

원본(영문) 버전에서 10000보다 작은 셀프 넘버를 출력하라길래, 전 10000보다 작은 셀프 넘버들만 출력했습니다.

출력 화면

일단 함수 d(n)은 나중에 정의 하도록 하고, 기본적인 원리부터 생각을 차근차근 해보도록 할게요.

일단 우리의 프로그램은 10000보다 작거나 같은 "셀프 넘버"를 한 줄에 하나씩 출력하는 프로그램이네요.

"셀프 넘버"라는 건, 생성자가 없는 숫자, 즉 d(n) 함수의 값이 아닌 숫자입니다.

ex) 20같은 경우에는 20보다 작은 어떤 수를 d(n)의 parameter로 넣어도, d(n)=20이 불가능해요.

package 백준; public class Main { public static void main(String[] args) { int [] arry = new int[10000]; //길이가 10000인 배열을 생성 int count = 1; //count는 d(n)에 들어갈 n을 의미함. while(count<10000) { //count, 즉 n을 1부터 시작해서 9999까지 다 넣어봅니다. if(d(count)<10000) { //만약 d(count) 값이 10000보다 작다면 arry[d(count)]++; //arry 배열에서 d(count) 위치에 1을 저장(초기값 0) } count ++; //계속 count를 1씩 더합니다. } for(int i=1; i<10000; i++) { //d(count)에는 1, 그 외에 셀프넘버는 0이 저장되어 있습니다. if(arry[i] == 0) { System.out.println(i); } } } public static int d(int num) { //우리의 함수 d(n) int org = num; //org에 원래 input인 num을 저장해주고 while(num>0) { //num이 0보다 클때동안 org += (num%10); //원래 input에 num%10, 즉 num의 일의 자리 수를 더해줍니다. num /= 10; // 그 후 10으로 나누어 일의자리를 없애고, 한 자리씩 올라가며 다 더해줍니다. } return org; } }

이런 식으로, d(n) 함수를 선언하고, 길이가 9999인 int type 배열을 생성하여, 문제를 풀었습니다.(런타임 오류 시 package name을 지워주세요. eclipse로 코딩해서 패키지 이름이 있습니다)

from http://louissong2001.tistory.com/35 by ccl(A) rewrite - 2021-10-19 14:26:56