smooth waters run deep

1d-1c/BOJ

4673_셀프 넘버 (C++)

yeon_11 2020. 8. 24. 15:33
 

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 visited[10001] = { 0, }; //방문 확인

void dfs(int num) {
	int temp = num;

	while (num) {
		int n = num % 10;
		temp += n;
		num /= 10;
	}

	if (temp<=10000 && !visited[temp]) {
		visited[temp] = 1;
		dfs(temp);
	}
	else return;
}

int main() {
	int num = 1;
	
	for (int i = 1; i <= 10000; i++) {
		if (!visited[i]) {
			dfs(i);
		}
	}

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

 

[문제 풀이 생각 과정]

1. 셀프 넘버가 처음에 이해가 잘안되서 좀 생각했다.

  예) 셀프 넘버 31 == 31의 생성자가 없다 == d(n)=31인 n이 없다 로 이해완료됨!

2. 셀프 넘버 수 <<< 생성자 존재하는 숫자 수 여서 '셀프 넘버를 바로 구하는 방법'을 생각했으나 실패

3. 1~10000 생성자 존재하는 수 제외하고 나머지 출력하는 방식으로 생각

  문제에서 d(d(d(n))) 와같이 힌트를 줬다. -- 이 부분보고 dfs 떠올랐고 습관적으로 visited[] 만들었다 ^..^

4. 하지만 런타임 에러 났다.

  d(n)을 돌리기 위한 변수 temp가 10000이 넘는 경우를 생각하지 않아서 - visited[] 범위를 초과한상태로 돌린 것!

  temp 범위 체크해서 다시 돌렸더니 통과!

 

그래도 dfs는 몇 문제 풀어봤다고 생각해낸 나.. 칭찬해 ㅠㅠ

** 배열사용할때는 무조건! 범위 체크하자!! 런타임 에러 그으만

 

'1d-1c > BOJ' 카테고리의 다른 글

2908_상수 (C++)  (0) 2020.08.26
1157_단어 공부 (C++)  (0) 2020.08.25
10809_알파벳 찾기 (C++)  (0) 2020.08.25
8958_OX퀴즈 (C++)  (0) 2020.08.17
[백준] 1051_숫자정사각형 (Silver3) (C++)  (0) 2020.04.26