[ 백준 4673번 ] 셀프 넘버
2021. 11. 29. 22:31ㆍ백준/단계별 문제
백준 4673번 / 6단계 / 셀프 넘버
채점 결과는 다음과 같다
메모리 | 시간 | |
1번째 방법 | 1112 KB | 0 ms |
문제 풀이
생성자에 의해 생성되는 수의 조건은 문제 예시처럼 12이라는 숫자가 있으면 십의 자리와 일의 자리를 분리해서 12 + 1 + 2 = 15라는 수가 나온다
여기서 12는 생성자가 되는 것이고 15는 생성자에 의해 생성된 수이다.
먼저 셀프 넘버 함수를 작성해 준다.
1. 메인 함수에서 정수 n 값을 인자 값으로 넘겨받고 결괏값 변수 result에 n 값을 대입해 준다
n이 0이 될 때까지 조건대로 n 값을 나머지 연산자를 이용해 한 자리씩 떼어서 result에 더해준다
ex)
n(12) % 10 = 2
n(12) = n(12) / 10 = 1.2 변수 타입이 정수형이므로 소수점은 버려져서 1로 저장이 된다
result(12) + 2 = 14
n(1) % 10 = 1
n(1) = n(1) / 10 = 0.1 변수 타입이 정수형이므로 소수점은 버려져서 0으로 저장이 된다
result(14) + 1 = 15
이렇게 생성자 12에 의해 생성된 수 result(15) 값을 메인 함수로 return 해준다
2. 생성자로 인해 생성된 수를 저장할 배열 조건에 맞게 만들어주고 0으로 초기화 시켜준다.
arr[0] ~ arr[10001] = 0
반복문 i를 10,000번 돌리면서 셀프 넘버 함수에 i 값을 전달해 준다 전달해 준 값은 위에 서술한 대로
셀프 넘버 함수에서 n 값으로 전달받으면서 생성자로 인해 생성된 수를 리턴해주면 그걸 변수 check에 받아서
배열 check 번째에 생성된 수라는 걸 임의로 1이라는 숫자로 넣어 판단해 준다.
이 과정은 1 과 0이 아닌 bool 타입으로 배열을 하나 선언해서 true와 false로 구분해도 된다
check = return = 15
15 = 생성된 수
arr[check(15)] = 1
3. 위 반복문이 끝나면 생성된 수는 모두 체크되었으므로 다시 반복문을 통해
각 인덱스 i마다 생성된 수를 확인하는 수 1이 아닌
초반에 초기화 해둔 0 이면 생성된 수가 아니므로 i를 출력해 준다
코드
#include <stdio.h>
#include <algorithm>
int self_number (int n) {
int result = n;
while(n != 0) {
result = result + (n % 10);
n /= 10;
};
return result;
}
int main() {
int i;
int check = 0;
int arr[10001] = {0, };
for ( i = 1; i < 10000; i++ ) {
check = self_number(i);
if ( check < 10001 ) arr[check] = 1;
}
for ( i = 1; i < 10000; i++ ) {
if (arr[i] == 0) printf("%d\n", i);
}
}
'백준 > 단계별 문제' 카테고리의 다른 글
[ 백준 11654번 ] 아스키 코드 (0) | 2021.12.05 |
---|---|
[ 백준 1065번 ] 한수 (0) | 2021.12.02 |
[ 백준 15596번 ] 정수 N개의 합 (0) | 2021.11.25 |
[ 백준 4344번 ] 평균은 넘겠지 (0) | 2021.11.22 |
[ 백준 8958번] OX퀴즈 (0) | 2021.11.15 |