1. 셀프 넘버
- 난이도
- 실버 5
- 시간 제한
- 1초
- 메모리 제한
- 256 MB
- 출처
A. 문제
- 실버 5
- 1초
- 256 MB
위 백준 사이트에 접속하여 문제를 확인해주세요.
B. 내 답안
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. 문제 해설
이해한 내용을 바탕으로 작성했습니다.
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)
내 풀이
- 처음에는 재귀적으로 푸는 방식을 시도했다.
- 재귀 스택 오버플로우가 발생한다.
- 그래서 단순히 반복문으로 해결했다.
C. 문제 해설
이해한 내용을 바탕으로 작성했습니다.
이해한 내용을 바탕으로 작성했습니다.
셀프 넘버 자체는 특별한 패턴이 없어 보인다. 따라서 d(n)을 구하고 1보다 크고 10000보다 작은 수 중에 d(n)이 아닌 수를 찾아야 한다.
- 문제에 주어진대로 d(n)을 구하는 작업을 반복한다.
- 파이썬은 문자열을 for문에 넣어서 원소 하나씩 꺼낼 수 있다.
- d(n)을 만족하는 n(생성자)는 1개 이상일 수 있기 때문에 중복제거를 해줘야 한다.
- d(n)을 통해 리턴된 값을 set()에 추가하여 중복제거를 해준다.
- 이 글을 쓰면서 생각난 방식인데, set()을 사용하는 대신, 아래 같은 방식을 이용할 수도 있다.
answer = list() for i in range(10001): temp = d(i) if temp not in answer: answer.append(temp)
추가로, 셀프 넘버 예시에 대해 잘 나와있는 자료가 있어서 링크를 걸어본다.
참고문헌
4673번: 셀프 넘버 (acmicpc.net). Baekjoon. (accessed Sep 14, 2021)
Ghost