[ 백준 4673번 ] 셀프 넘버

2021. 11. 29. 22:31백준/단계별 문제

백준 4673번 / 6단계 / 셀프 넘버

백준 4673번 - 셀프 넘버

 

채점 결과는 다음과 같다

  메모리 시간
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