안녕하세요 성조입니다.
이번 포스팅은 자바 11버전으로 풀이됐습니다.
문제 출처
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가 이름 붙였다. 양의 정수 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보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.
코드
public class b_4673 {
public static final int MAX = 10001;
public static void main(String[] args) {
boolean selfNumber[] = new boolean[MAX];
for(int i=0; i<MAX ;i++) {
int req = calculating(i);
if(req < MAX) {
selfNumber[req] = true;
}
}
for(int j=0; j<MAX; j++) {
if(!selfNumber[j]) {
System.out.println(j);
}
}
}
public static int calculating(int number) {
int res = number;
while(number!=0){
res = res + (number % 10);
number /= 10;
}
return res;
}
}
풀이
문제 접근 할 때 다음 빨간색 영역을 우선 이해했다.
줄을 읽고 공통된 부분을 해석하면 다음과 같은 문장으로 만들 수 있다.
1. 생성자는 [시작 값 + 10의 자리 수 + 1의 자리 수]를 더한 값이다.
ex) 33은 39의 생성자. 39는 51의 생성자. 51은 57의 생성자.
이후 지문으로 다시 접근했다.
생성자가 없는 숫자들을 셀프 넘버라고 정의했다.
셀프 넘버 = 생성자가 없는 숫자 [생성자X]
2. 생성자가 존재하지 않는지 판별한다. -> [ true or false ]
3. 참 거짓을 정리하여 출력한다.
calculating 메서드를 활용하여 생성자가 발생하는지 확인한다.
발생한 경우 true를 발생 위치에 저장한다.
이후 배열에 생성자가 존재하는 값을 출력하기 위해서 값이 아닌 경우(!변수)를 출력하면 셀프 넘버를 출력하게 된다.
++ [참고] boolean 값의 경우 처음 초기화된 값은 모두 false로 나오기 때문에 true로 모두 초기화한 것이 아니므로 false를 true로 바꾸는 접근 방법을 선택했다.
생각보다 오랜 시간이 들었던 문제였습니다.
2020.12.29 - [C And C++/C] - [C언어] 카프리카수 구하기, 네 자리 Kaprika수 구하기 프로그램
[C언어] 카프리카수 구하기, 네 자리 Kaprika수 구하기 프로그램
안녕하세요 성조입니다. 이전에 풀었던 카프리카 수(Kaprika) 문제에 대해서 갖고 왔습니다. ko.wikipedia.org/wiki/%EC%B9%B4%ED%94%84%EB%A6%AC%EC%B9%B4_%EC%88%98 카프리카 수 - 위키백과, 우리 모두의 백과사전 위
okeybox.tistory.com
20년도에 카프리카 수 찾아내는 문제를 풀었을 때는 생각보다 10의 자리와 1의 자리를 구분하는 접근 방식이 되게 자연스러웠는데 이번 문제를 풀 때 문제를 이해하는데 생각보다 오래 걸렸습니다.
문제 풀이에 있어서 노트에 적어 놓은 접근 방식을 실제 자바 코드로 구현하려 하니. 자바를 주력으로 생각하면서 생각보다 자바 문법을 모르는 부분이 많았다는 것을 생각해냈던 문제였습니다. 자바 문법에 대해서 알고 있으니 넘어가는 것보다 가능하면 정리해서 아는 것으로 만드는 과정을 많이 경험해야겠습니다.
오타나 이해가 안가는 부분이 있다면 언제든지 댓글로 얘기해 주시면 감사드리겠습니다.
다음 포스팅 때 뵙겠습니다.
참조
https://zetawiki.com/wiki/%EC%85%80%ED%94%84_%EB%84%98%EB%B2%84
셀프 넘버 - 제타위키
다음 문자열 포함...
zetawiki.com
'백준 - Java' 카테고리의 다른 글
[백준 - 1312][Java] 소수 (0) | 2023.01.08 |
---|---|
[백준 - 1032][Java] 명령 프롬프트 (0) | 2023.01.07 |
[백준 - 10886][Java] 0 = not cute / 1 = cute (0) | 2022.12.28 |
[백준 - 5717][Java] 상근이의 친구들 (0) | 2022.12.24 |
[백준 - 1259][Java] 팰린드롬수 (해설 추가 필요) (0) | 2022.08.26 |