문제
https://www.acmicpc.net/problem/4673
문제 이해
셀프 넘버라는 것을 이해하는대에 시간이 들었습니다.
https://zetawiki.com/wiki/%EC%85%80%ED%94%84_%EB%84%98%EB%B2%84
셀프 넘버에 대한 설명입니다.
양의 정수 n에 대해서 d(n)을 n과 n의 각 자리의 수를 더하는 함수 를 만들 건대
n을 8이라고 생각해 봅시다.
d(8) = 8과 8의 각 자리의 수
8의 자리의수는 8입니다. 그러므로 8+8 로 계산할 수 있습니다.
즉, 이런 셀프넘버가 아닙니다.
생성자가 있으니깐요
n을 1이라고 생각해 봅시다.
d(1) = 1과 1의 각 자리의 수
1+1로 2가 나오게 됩니다.
그렇다면 셀프넘버는 어떤것 일까요
n에 어떤값을 넣어도 3이 나오지 않습니다.
n에다가 1.5를 넣어보면 (자기자신 + 각 자리의 수) = (1.5 + 1.5)가 되야 하는데 문제는 n을 양의 정수로 제한하고 있습니다.
즉, 3은 셀프넘버 입니다.
n으로 나오는 수는 모두 셀프 넘버가 아니라는것을 알 수 있습니다.
코드
def d():
not_self_number=[]
for i in range(1,10001):
l = list(map(int,str(i)))
#셀프넘버가 아닌 것들
not_self_number.append(i + sum(l))
for x in range(1,10001):
if x not in not_self_number:
print(x)
d()
1번
for문으로 1씩 증가하면서 각 값의 자리수를 리스트 형태로 분리합니다.
ex) 87 = ["8", "7"]로 만들어 줍니다.
2번
d(n) = n + 각 자리수 라고 했으니
각 자리수의 값들을 모두 더하는 sum()을 사용하고 n 그 자체를 더해서 list를 만들어 줍니다.
3번
그럼 셀프넘버가 아닌 것들을 not_self_number라는 리스트에 넣어두었습니다.
4번
다시 10000번을 for문을 돌려 not in not_self_number 리스트에 있는 것을 제외한 것을 출력했습니다.
for문을 2번돌리는것에 대해 아쉬움이 있습니다.
그래서 코드를 바꿔보니
def d():
not_self_number=[]
x = range(1,10001) #10001까지 리스트
for i in x: #1~10001까지
l = list(map(int,str(i)))
#셀프넘버가 아닌 것들
not_self_number.append(i + sum(l))
for j in x: #1~10001까지
if j not in not_self_number:
print(j)
d()
for문을 몇번 돌릴지에 대한 변수 x를 지정해봤습니다.
x는 range 타입입니다.
'알고리즘 > 백준알고리즘' 카테고리의 다른 글
[백준 알고리즘/Python3] 10809 알파벳 찾기 (0) | 2021.08.26 |
---|---|
[백준 알고리즘/Python3] 1065 한수 (0) | 2021.08.23 |
[백준 알고리즘/Python3] 2884 알람시계 (0) | 2021.07.20 |
[백준 알고리즘/Python3]14681 사분면 고르기 (0) | 2021.07.20 |
[백준 알고리즘/Python3] 2753 윤년 (0) | 2021.07.20 |