Baekjoon/단계별로 풀어보기

[BOJ/백준] 4673번 셀프 넘버 C++ 문제 풀이

728x90

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

문제

문제 링크 : 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

 

 

풀이

다음과 같이 함수를 사용하지 않고 코드를 작성했었지만,

#include <iostream>
using namespace std;

int main() {
	int num[10000] = { 1, };
	int temp;

	for (int i = 0; i < 10000; i++) {
		if (i < 10)
			num[i + i] = 1;
		else if (i < 100)
			num[i + i / 10 + i % 10] = 1;
		else if (i < 1000)
			num[i + i / 100 + i % 100 / 10 + i % 10] = 1;
		else if (i < 10000) {
			temp = i + i / 1000 + i % 1000 / 100 + i % 100 / 10 + i % 10;
			if (temp < 10000)
				num[temp] = 1;
		}
	}
	for (int i = 1; i < 10000; i++) {
		if (!num[i])
			cout << i << endl;
	}
}

이번에 새로 단계별 풀이 목적에 맞춰! 함수를 사용하여 작성했습니다.

문제에서 정의한 n과 n의 각 자리수를 더하는 d(n)함수를 구현하고,

모든 수에 대해 d(n) 함수를 실행하여 셀프넘버가 아닌 수를 true로 설정하는 self_number()함수를 작성했다.

메인문에서는 self_number()를 한번 실행하고 self_number 여부를 저장한 배열을 출력만 할 수 있도록 하였다.

이와 같이 함수를 사용하면 메인문에서 필요한 기능에 따라 함수를 호출, 사용하여 가독성 좋은 코드를 작성할 수 있다.

함수의 재사용을 쉽게 하기 위해서는 함수의 기능이 잘 나타나도록 함수 이름을 정하는 것 또한 중요하다.

 

CODE

#include <iostream>
using namespace std;

bool num[10001];

int d(int n) {
	int temp;
	temp = n + n / 1000 + n % 1000 / 100 + n % 100 / 10 + n % 10;
	return temp;
}

void self_number() {
	int temp;
	num[1] = false;
	for (int i = 0; i < 10000; i++) {
		if (i < 10000) {
			temp = d(i);
			if (temp < 10000)
				num[temp] = true;
		}
	}
}

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

 

결과

728x90