본문 바로가기

알고리즘/백준알고리즘

[백준 알고리즘/Python3] 4673 셀프 넘버

문제 

https://www.acmicpc.net/problem/4673

 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

 

문제 이해

 

셀프 넘버라는 것을 이해하는대에 시간이 들었습니다.

 

 

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 타입입니다.

 

 

 

728x90