본문 바로가기
알고리즘/백준 문제 풀이

[BOJ/백준] 4673번 셀프 넘버 - [c/c++] 풀이

by 미니상미니 2022. 10. 13.
반응형

https://www.acmicpc.net/problem/4673

 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

 

 

 

 


  • 문제

단계별로 풀어보기 - 함수 - [2단계] 4673번


해설

n의 다음 항은 n + (n의 각 자리 수의 합)이다. 123 -> 123 + 1 + 2 + 3 = 129이다.

다음 항을 구하는 함수를 int d(int n) 함수에 작성하였다.

 

메인 함수에서 1부터 10000까지 수의 다음 항을 구하여 배열에 true로 저장하였다.

즉 true로 저장된 값은 생성자가 있다는 의미로 셀프 넘버가 아니다.

*배열에 저장할 때 수가 10000 이하일 때만 처리해주어야 한다.

 

따라서 1부터 10000까지 순회하며 false인 경우의 수만 출력하면 된다.

 

함수 없이 풀 수 있는 문제지만 함수 파트니 함수를 활용하여 푸는 걸 추천한다.

 

코드

c

#include <stdio.h>

bool check[10001];

int d(int n) {
	int sn = n;

	while (n != 0) {
		sn += n % 10;
		n /= 10;
	}

	return sn;
}


int main() {
	
	int n;


	for (int i = 1; i <= 10000; i++) {
		n = d(i);

		if (n <= 10000) check[n] = true;
	}

	for (int i = 1; i <= 10000; i++) {
		if (!check[i]) printf("%d \n", i);
	}



	return 0;
}

 

c++

#include <iostream>

using namespace std;

bool check[10001];

int d(int n) {
	int sn = n;

	while (n != 0) {
		sn += n % 10;
		n /= 10;
	}

	return sn;
}


int main() {
	
	int n;


	for (int i = 1; i <= 10000; i++) {
		n = d(i);

		if (n <= 10000) check[n] = true;
	}

	for (int i = 1; i <= 10000; i++) {
		if (!check[i]) cout << i << '\n';
	}



	return 0;
}

 

 

 

 

 

반응형

댓글