-
백준 4673 셀프 넘버 파이썬IT/알고리즘 2022. 2. 23. 00:17728x90
풀이
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