BEAKJOON

백준(4673번 셀프 넘버)풀이 C++

Shin_jisoo 2020. 12. 6. 21:25
728x90

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

1) 주석없는 VERSION

#include <iostream>
using namespace std;

int main() {
	int array[10000] = { 1, };
	int n;

	for (int i = 1;i < 10000;i++) {
		if (i < 10) {
			array[i + i] = 1;
			continue;
		}
		else if (i < 100) {
			array[i + i / 10 + i % 10] = 1;
			continue;
		}
		else if (i < 1000) {
			array[i + i / 100 + i % 100 / 10 + i % 10] = 1;
			continue;
		}
		else if (i < 10000) {
			n = i + i / 1000 + i % 1000 / 100 + i % 100 / 10 + i % 10;
			if (n < 10000) {
				array[n] = 1;
				continue;
			}
		}
	}

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

2) 주석있는 VERSION

#include <iostream>
using namespace std;

int main() {
	int array[10000] = { 1, }; // 1부터 초기화
	int n;

	// 숫자를 10,100,1000,10000 구간으로 정해서
	// 생성자인 것을 1로 정의
	for (int i = 1;i < 10000;i++) {
		if (i < 10) {
			array[i + i] = 1;
			continue;
		}
		else if (i < 100) {
			array[i + i / 10 + i % 10] = 1;
			continue;
		}
		else if (i < 1000) {
			array[i + i / 100 + i % 100 / 10 + i % 10] = 1;
			continue;
		}
		else if (i < 10000) {
			n = i + i / 1000 + i % 1000 / 100 + i % 100 / 10 + i % 10;
			if (n < 10000) { // 10000 넘는 값이 나오므로 따로 분기 처리
				array[n] = 1;
				continue;
			}
		}
	}

	for (int i = 1;i < 10000;i++) {
		if (!array[i]) // 1이 아닌 값이 셀프 넘버 이므로
			cout << i << "\n";
	}
}

 

❌주의사항❌

◾ i<10000 에서 continue는 분기 처리 안에서