백준 4673번, if문 not in (미해결)

    문제

    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

    나의 풀이

    arr=[1]*(10001)
    def checkselfnumber(n):
    	n=n+sum(map(int,str(n)))
    	arr[n]=0
    
    for a in range(1,10001):
    	checkselfnumber(a)
    	if arr[a]:
    		print(a)

    이 풀이는 런타임 에러가 난 풀이이다.

     

    다른 사람의 풀이 1

    def d(n):
        return n+sum(map(int,list(str(n))))
    
    self = [True]*10001
    for i in range(10001):
        q = d(i)
        if q < 10001:
            self[q] = False
    for i in range(10001):
        if self[i]:
            print(i)

    내 풀이와 비슷하다고 느꼈는데 이 풀이는 런타임에러가 나지 않은 것에 대해 궁금증을 가지고 있다.

    여기서 q=d(i)를 굳이 왜 했을까 잠깐 생각해보았는데 계속 d(i)를 사용하게 되면 d()함수를 계속 호출하여 사용해야하므로 q를 사용한 것이었다.

     

    다른 사람의 풀이를 참고해서 제출한 풀이

    def checkselfnumber(n):
    	n=n+sum(map(int,str(n)))
    	return n
    
    noSelfNumber=set()
    
    for i in range(1,10001):
    	noSelfNumber.add(checkselfnumber(i))
    
    for i in range(1, 10001):
    	if i not in noSelfNumber:
    		print(i)

    checkselfnumber()함수를 이용해 noSelfNumber라는 set에 셀프넘버가 아닌 수를 담았고 if문에서의 not in을 이용해 1부터 10001까지의 수 중 noSelfNumber가 아닌 즉 셀프넘버를 출력하는 함수이다.

    '알고리즘 공부' 카테고리의 다른 글

    백준 2941번  (0) 2022.12.08
    백준 1065번  (0) 2022.12.07
    백준 10250번, divmod()  (0) 2022.12.03
    백준 1712번  (0) 2022.11.30
    백준 10757번, 파이썬의 큰 정수 입력받기  (0) 2022.11.30

    댓글