Baekjoon

[백준 C++] 4673번 - 셀프 넘버

yujin0517 2022. 1. 6. 14:28

4673번 - 셀프 넘버

문제

 

<코드 설명>

  1. 크기가 10000인 int 배열 선언하기 
  2. for문을 사용하여 셀프 넘버 찾기
  3. 셀프 넘버의 배열 값은 0, 셀프 넘버가 아닌 배열 값은 1
  4. 배열 값이 0인(셀프 넘버)만 출력
#include <iostream>
using namespace std;

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

	for (int i = 1; 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 % 100 % 10] = 1;
		}
		else if (i < 10000) {
			tmp = i + i / 1000 + i % 1000 / 100 + i % 1000 % 100 / 10 + i % 1000 % 100 % 10;
			if (tmp < 10000) num[tmp] = 1;
		}
	}

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

 

num배열의 index 0은 생성자를 통해 만들어질 수 없는 숫자이기에 배열 값을 1로 선언합니다. 

for문 안에서 10, 100, 1000, 1000보다 작은 i값으로 범위를 정해서 셀프 넘버를 찾았습니다. 

i값이 10보다 작을 경우는 (i + i) 인덱스 값에 1을 넣어주고,

i값이 100보다 작을 경우는 (i + i / 10 + i % 10) 인덱스 값에 1을 넣어주고,

i값이 1000보다 작을 경우는  (i + i / 100 + i % 100 / 10 + i % 100 % 10) 인덱스 값에 1을 넣어주고,

i값이 10000보다 작을 경우는 (i + i / 1000 + i % 1000 / 100 + i % 1000 % 100 / 10 + i % 1000 % 100 % 10) 인덱스 값에 1을 넣어줍니다. 이때, i값이 10000보다 작을 경우는 인덱스가 10000보다 작은 경우에만 인덱스의 배열 값에 1을 넣어줘야 합니다. 인덱스가 10000보다 클 경우 배열의 크기를 넘어서기 때문에 비정상적인 종료가 일어납니다. 

 

이 문제를 풀 때 가장 중요하게 생각해야 할 부분은 생성자를 통해 인덱스를 찾는 과정이라고 생각합니다. 그리고 인덱스 값이 배열의 크기를 초과하지 않는지 확인하는 부분도 중요하다고 생각합니다.

이 두 가지만 주의한다면 비교적 쉽게 문제를 풀 수 있다고 생각합니다. 

 

감사합니다!

2022.10.06