본문 바로가기
IT/알고리즘

백준 4673 셀프 넘버 파이썬

by 시작은코딩 2022. 2. 23.
반응형


풀이

num = list(range(1, 10001))
no_self_num = set()

for i in range(1, 10001):             
    for j in str(i):            
        i += int(j)             
    no_self_num.add(i)  

cg_set_num = set(num)
self_num = sorted(cg_set_num - no_self_num)
for i in self_num:
    print(i)

 

이번 문제도 나를 매우 곤란하게 하여 지난번 도움 많이 받은 wook-2124님의 블로그를 참고했음을 미리 알린다.

(물론 혼자서 왜 이렇게 나왔는지를 매우 고민하였음)

 

자, 차근차근 또 보면서 ..설명 ㄱㄱ

 

num = list(range(1, 10001))
no_self_num = set()

1. 범위 1부터 10000까지의 리스트 형태로 num 변수에 담아주었다. 

 - 사실 여기서 그냥 set 형태로 담아주면 되는데,

예)
natural_num = set(range(1, 10001))

예를들면 이렇게, 근데 왜 나는 set을 왜 안썼냐? 고집이고 객기야

 

for i in range(1, 10001):             
    for j in str(i):            
        i += int(j)             
    no_self_num.add(i)

2. for 문을 2번 반복해주는데, 중요한건 안에 들어있는 for문 str(i) 이다.

str(i) 는 예를들어 첫번째 range(1, 10001)의 for문이 돌 때 350이라는 숫자가 i에 입력되면

str(i)는 '3' '5' '0' 으로 나누어 j에 넘겨주고,

 

str으로 값을 받은 j를 다시 int(j)롤 바꿔줘서 받은 i값에  += 를 해준다 !

 

그리고  그 값을 위에 먼저 set 형태로 만들어둔 no_self_num 변수에 추가해준다. list는 append 였는데, set은 add군

 

cg_set_num = set(num)
self_num = sorted(cg_set_num - no_self_num)

3.

그리고 맨 처음 말했던 리스트로 만든 num 을 set로 바꿔 cg_set_num 변수에 넣음 . 왜 두 번 일해?

왜냐면 난 사실 list - list를 하고 싶었는데, 계속 에러가 났거든.. 찾아보니 list - list는 안된다고함. ㅋ;;

set 함수는 된다네 ? 그래서 그랬어.. 굳이 다시 1번에서 바꾸지 않은 이유는 내 고집임 (??미친놈인가?)

여차저차 이리저리 사이사이 print 해보며 아 이런값이 이렇게 들어가고 나오는구나를 확인 하였당

 

마지막에 그래서 self_num 변수에 sorted →정렬된 값으로 cg_set_num - no_self_num 을 해줬다. set함수를 쓰면 정렬이 안된다고 해서 set함수 쓰고 요런 빼기 같은거 쓸때는 sorted 함수를 써주자.

 

그래서 요 빼주기는 왜 하느냐? 말 그대로 이 문제가 요구하는 셀프 넘버를 찾기 위해서였지.

cg_set_num → 1~10000까지 다 정렬된 넘버

no_self_num → 아까 for 문 돌면서 생성자가 다 있는 애들만 입력된 값

 

둘이 빼주면 결국 생성자가 없는 애들만 남는다는 얘기.

for i in self_num:
    print(i)

4.

마지막으로 for문으로 반복하여 하나씩 출력되게 하면 끝! 

 

반응형

'IT > 알고리즘' 카테고리의 다른 글

백준 11720 숫자의 합 파이썬  (0) 2022.02.24
백준 1065 한수 파이썬  (0) 2022.02.24
백준 4344 파이썬 평균은 넘겠지  (0) 2022.02.22
백준 8958 OX퀴즈 파이썬  (0) 2022.02.21
백준 1546 평균 파이썬  (0) 2022.02.21