# [백준] 4673번 - 셀프 넘버

- Author: @mildsalmon
- Published: 2021-09-14
- Updated: 2021-09-14
- Source: http://blex.me/@mildsalmon/%EB%B0%B1%EC%A4%80-4673%EB%B2%88-%EC%85%80%ED%94%84-%EB%84%98%EB%B2%84
- Tags: 파이썬, 알고리즘, 수학, 코딩테스트, 문제, 구현, 백준

---

# 1. 셀프 넘버

- 난이도
	- 실버 5
- 시간 제한
	- 1초
- 메모리 제한
	- 256 MB
- 출처
	- [4673번: 셀프 넘버 (acmicpc.net)](https://www.acmicpc.net/problem/4673)

### A. 문제

위 백준 사이트에 접속하여 문제를 확인해주세요.
	
### B. 내 답안

```python

def d(n):  
    s_n = str(n)  
    result = n  
  
    for i in s_n:  
        result += int(i)  
  
    return result  
  
set_n = set()  
list_n = [i for i in range(1, 10001)]  
  
for i in range(10001):  
    set_n.add(d(i))  
  
# set_n = list(set_n)  
  
for i in list_n:  
    if i not in set_n:  
        print(i)

```

##### a. 회고

> 내 풀이

- 처음에는 재귀적으로 푸는 방식을 시도했다.
	- 재귀 스택 오버플로우가 발생한다.
- 그래서 단순히 반복문으로 해결했다.

### C. 문제 해설

> 이해한 내용을 바탕으로 작성했습니다.

셀프 넘버 자체는 특별한 패턴이 없어 보인다. 따라서 d(n)을 구하고 1보다 크고 10000보다 작은 수 중에 d(n)이 아닌 수를 찾아야 한다. 

1. 문제에 주어진대로 d(n)을 구하는 작업을 반복한다.
	- 파이썬은 문자열을 for문에 넣어서 원소 하나씩 꺼낼 수 있다.
2. d(n)을 만족하는 n(생성자)는 1개 이상일 수 있기 때문에 중복제거를 해줘야 한다.
	- d(n)을 통해 리턴된 값을 set()에 추가하여 중복제거를 해준다.
	- 이 글을 쓰면서 생각난 방식인데, set()을 사용하는 대신, 아래 같은 방식을 이용할 수도 있다.
		```python
		
		answer = list()
		
		for i in range(10001):
			temp = d(i)
			if temp not in answer:
				answer.append(temp)
				
		```

추가로, 셀프 넘버 예시에 대해 잘 나와있는 자료가 있어서 링크를 걸어본다.

[셀프 넘버 - 제타위키 (zetawiki.com)](https://zetawiki.com/wiki/%EC%85%80%ED%94%84_%EB%84%98%EB%B2%84)

# 참고문헌

[4673번: 셀프 넘버 (acmicpc.net)](https://www.acmicpc.net/problem/4673). Baekjoon. (accessed Sep 14, 2021)
