백준 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 인 부분(생성자가 없는 셀프 넘버) 만 프린트를 해준다.
'Python > Python 코딩테스트' 카테고리의 다른 글
[백준] 2623번 음악 프로그램 / 위상 정렬 알고리즘 (0) | 2021.06.16 |
---|---|
[프로그래머스] 파이썬 [1차] 뉴스 클러스터링 / 2018 카카오 kakao blind 코딩 테스트 문제 풀이 (0) | 2021.06.14 |
[백준] 10250번 파이썬 : ACM 호텔 /python (0) | 2021.06.11 |
[백준 1712번] 파이썬 풀이 python (0) | 2021.06.11 |
[Baekjoon 백준] 2439번 별찍기-2 / 오른쪽 기준으로 별 정렬하기 (0) | 2021.06.05 |
댓글