안녕하세요. BlockDMask 입니다.
추석날 2번째 문제 입니다. 왔다 갔다 차안에서 문제를 풀고 있습니다. 길이 많이 막히네요;;
170818 문제 빼먹음 -> 171004 완료
0. 제목
백준 4673 셀프 넘버
BOJ 4673 self number
1. 문제 설명
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다.
양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의한다.
예를 들어 d(42) = 42 + 4+ 2 = 48 이다.
양의 정수 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일은 생성자가 91, 100으로 두가지 이다.
생성자가 없는 숫자를 셀프 넘버라고 한다.
100보다 작은 셀프 넘버는 총 13개가 있다.
1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97.
10,000 보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
2. 풀이 설명
a) 10001 의 index를 가진 bool type 배열을 선언 및 초기화 합니다.
b) 배열의 index (1~10000) 숫자를 하나씩 solution 함수에 넣어서 확인합니다.
숫자가 들어오면
자기 자신의 숫자 n 과
자기 자신의 숫자의 1의 자리
자기 자신의 숫자의 10의 자리
자기 자신의 숫자의 100의 자리
.
.
.
를 계속 더해줘서 생성자를 가진 수를 판별합니다.
c) 생성자를 가진 숫자를 판별해서 빼줍니다. (true로 변경)
d) 배열의 남아있는 숫자를 출력합니다. (false인 수 출력)
3. 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | //BOJ 4673 셀프넘버 #include<iostream> #include<cstdio> #define N 10001 //배열 arr[1 ~ 10000] 까지 이므로 10001. using namespace std; bool arr[N]; //셀프넘버 판별 함수. int solution(int n){ int sum = n; //자기 자신을 먼저 더해주고 while(1){ // 각 자리수의 숫자를 더해야하므로 1의 자리를 계속 더해준다. if(n == 0) break; //0이 되면 break sum += n%10; //1의 자리 더해주기 n = n/10; //한자리씩 없애기 } return sum; } int main(void){ for(int i=1; i<N; i++){ int idx = solution(i); if(idx <= N){ arr[idx] = true; //셀프넘버 아닌 수 true 로 변경 } } //출력 for(int i=1; i<N; i++){ if(!arr[i]) printf("%d\n", i); } return 0; } | cs |
4. 인증
문제 출처 - https://www.acmicpc.net/problem/4673
감사합니다. 하트 꾹 부탁드립니다.!!
'<알고리즘 문제풀이&연습> > [C++] 백준, 프로그래머스 등등' 카테고리의 다른 글
[백준 1764] 듣보잡 (0) | 2017.10.10 |
---|---|
[백준 1920] 수 찾기 (이진탐색) (0) | 2017.10.08 |
[백준 2562] 최대값 (0) | 2017.10.08 |
[백준 2309] 일곱 난쟁이 (브루트 포스) (0) | 2017.10.06 |
[백준 2941] 크로아티아 알파벳 (0) | 2017.10.04 |
[백준 5622] 다이얼 (0) | 2017.10.03 |
[백준 13458] 시험 감독 (1) | 2017.09.26 |
[백준 2292] 벌집 (1) | 2017.09.26 |