티스토리 뷰
문제.
n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다. 생성자가 없는 숫자를 셀프 넘버라고 한다. 100보다 작은 셀프 넘버는 총 13개가 있다. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97 10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
입출력.
10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.
방법.
i 라는 생성자를 가지는 sum을 구해서 반환하는 함수 d를 만든다. sum의 값이 10000보다 큰 경우 0을 반환하고, 0이 아닌 경우에만 해당 인덱스에 저장한다.
#include <stdio.h>
int d(int i);
int main() {
//문제04673 / 2021.02.28
int arr[10001] = {0,}; //모두 0으로 초기화, 생성자가 있는 경우 +1
int idx=0;
for(int i=1; i<10001; i++){
idx = d(i);
if(idx!=0) arr[idx]+=1;
}
for(int i=1; i<10001; i++) {
if(arr[i]==0) {
printf("%d\n", i);
}
}
return 0;
}
int d(int i){
int sum = i, n = i;
while(n!=0) {
sum+=n%10;
n/=10;
}
if (sum<10001) return sum;
else return 0;
}
Insight.
처음 코드를 짰을 때 sum의 값이 10001보다 작다는 조건을 주지 않아서 런타임 오류가 발생해서 한참 고민했다. 그리고 처음에는 if문을 사용해서 100보다 작은수, 1000보다 작은수, 10000보다 작은 수를 구분 조건을 주다가 런타임오류를 잡던 중에 while문으로 바꾸어서 코드를 더 간결하게 할 수 있었다.
'Computer Science > 백준 알고리즘' 카테고리의 다른 글
[백준.03309-C언어] 네 번째 점 (0) | 2021.03.04 |
---|---|
[백준-JAVA] 제어문 (0) | 2021.03.03 |
[백준.1단계-JAVA] 입출력과 사칙연산 (0) | 2021.02.27 |
[백준.11720-C언어] 숫자의 합 (0) | 2021.02.26 |
[백준.01157-C언어] 단어 공부 (0) | 2021.02.25 |
댓글