[백준 4673번] 셀프 넘버
본문 바로가기
Python/Python 코딩테스트

[백준 4673번] 셀프 넘버

by 쏠수있어ㅤ 2021. 6. 8.
반응형

 

 

 

백준 4673번 셀프 넘버 

 

처음에 이 많은걸 다 for로 돌리진 않겠지, 무슨 공식이 있지않을까 고민고민하다가 찾아보니 결국 모두 계산하는 방법이었다 ! 

 

1. set을 활용한 방법

a = set(range(1,10001))
you = set()

for i in a:
    for j in str(i):
        i += int(j)
    if i<=10000:
        you.add(i)

answer = a-you

for i in sorted(answer):
    print(i)

set 자료집합형은 기본적으로 중복이 되지 않는다 그리고  -  빼기를 할 수 있는 점이 놀랍다. 

설명 : range 1~ 10000까지 자료집합형에 담고 for문으로 한개씩 돌리며 해당 i에 i의 각 자리의 수를 더한다 -> 이렇게 만들어진 i 는 생성자가 있는 수이므로 you 자료 집합형에 넣어둔다. 그리고 1~10000에서 생성자가 있는 수의 집합인 you 를 빼면 나머지 생성자가 없는 숫자들이 남고 이를 sorted 로 차례대로 print해주면 된다. 

 

 

2. list 활용법

a = list(range(1,10001))
you = []

for i in a:
    for j in str(i):
        i += int(j)
    if i<=10000:
        you.append(i)

for i in set(you):
    a.remove(i)

for i in a:
    print(i)

list를 활용한 방법도 위와 비슷하다. set에는 add, - 쓰이고 list에는 append, remove가 쓰인다! 

 

 

 

3. list 활용법 2 

l = [0]*11000

for x in range(1,10001):
    l[x +(x//1000)%10 + (x//100)%10 + (x//10)%10 + x%10] += 1

for x in range(1,10001):
    if l[x]==0:
        print(x)

먼저  l 이라는 list에 [0] * 11000 을 해둔다. 여기서 11000 수는 12000, 10500 , 20000도 된다. 아래 for구문이 돌면서 생기는 수가 충분히 들어갈만한 list를 만드는게 목적이다. 

 

range(1,10001) 동안  x로 x + x의 각자리수를 더한 값의 l list 인덱스 자리에 +1을 해준다.  그냥 + 가 아닌 += 로 한 이유는 해당 값이 중복으로 나올 수 있기 떄문!  그리고 다시 l의 [x] 자리 중 1이 아닌 ==0 인 부분(생성자가 없는 셀프 넘버) 만 프린트를 해준다. 

 

 

반응형

댓글