반응형
https://www.acmicpc.net/problem/4673
코드
#include <stdio.h>
int d(int n);
int d(int n) { //d(n)을 만드는 함수
int sum = n;
while (n >= 10) {
sum += (n % 10);
n /= 10;
}
sum += n;
return sum;
}
int main() {
int a[10001] = {};
int b[10001] = {};
for (int i = 1; i < 10001; i++) { a[i - 1] = i; b[i - 1] = i; } // 배열에 1~10000까지 넣기
for (int i = 0; i < 10001; i++) {
int temp = 0;
temp = d(a[i]);
for (int k = 0; k < 10001; k++) {
if (temp == a[k]) { b[k] = 0;} // d(n)은 다시 생성자가 될 수 있기 때문
}
}
for (int i = 0; i < 10001; i++) {
if (b[i] != 0) { printf("%d\n", b[i]); }
}
return 0;
}
☞ 풀이 전
우선,셀프 넘버를 찾는 것보다 규칙이 있는 셀프 넘버가 아닌 것을 찾아서 배열에서 제외시키는게 더 효율적이라고 생각했다. (라고 생각했음에도 자꾸 삽질해서 약간 참고했다.)
셀프 넘버가 아닌 수는 해당하는 배열의 수의 index를 찾아서 값을 0으로 선언해주어 셀프 넘버를 출력할 수 있게끔해주려 했다.
☞ 풀이 후
10000이하의 수라고 문제에서 명시했음에도 2자리 수나 3,4자리 수여도 (100,1000)같은 것만 생각하여 6,7번 줄을 바꿔 코드를 작성하여 자꾸 이상한 수가 나왔었다..
n을 d(n)의 생성자라 했을 때 d(n)은 다시 d(d(n))의 생성자가 될 수 있었고 역시 예제를 통해 보여줬다.
그래서 난 배열을 하나 더 만들어주어 n으로 시작하여 d(d(n)) . . .으로 뻗어가는 수열이 제외되지 않도록 하였다.
하지만 지저분했다..
☞ 다른 사람의 코드
#include <stdio.h>
int d(int n) {
int sum = n;
while(n>0) {
sum += n%10;
n = n/10;
}
return sum;
}
int main() {
int arr[10001]={0}, result=0;
for(int i=0; i<10001; i++) {
result = d(i);
if(result < 10001)
arr[result] = 1;
}
for(int j=0; j<10001; j++) {
if(arr[j] != 1)
printf("%d\n", j);
}
}
출처 : https://unie2.tistory.com/10
이 분은 배열의 index와 원소의 값을 같게 생각하였다.
0을 굳이 제외할 필요가 없었는데 이 사소한 디테일이 굉장히 간략하게 해주었다.
사소함의 중요성 그리고 예제 같은 것이 주어졌을 때 어렵게 생각하기 보다 한 번 해보자라는 생각
이전에 나왔던 특정 배열의 원소만 출력하기 아이디어
배울 게 많았던 문제였다. 더 정진하자.
반응형
'Baekjoon' 카테고리의 다른 글
[C] 백준 2908번 : 상수 (0) | 2023.01.09 |
---|---|
[C] 백준 1065번 : 한수 (0) | 2023.01.09 |
[C]백준 15596번 : 정수 N개의 합 (0) | 2023.01.05 |
[C] 백준 4344번 : 평균은 넘겠지 (0) | 2023.01.04 |
[C] 백준 8958번 : OX퀴즈 (1) | 2022.09.08 |