[Python] 코딩 도장 - 완전수 구하기

Updated:

코딩 도장 사이트의 문제를 직접 풀어본 내용을 정리하여 올립니다.

코딩 도장에서 여러 문제를 확인할 수 있습니다.

난이도 순으로 차근차근 풀어보려 합니다.


[문제: 완전수 구하기] - Lv.1

자기 자신을 제외한 모든 양의 약수들의 합이 자기 자신이 되는 자연수를 완전수라고 한다.

예를 들면, 6과 28은 완전수이다. 6=1+2+3 // 1,2,3은 각각 6의 약수 28=1+2+4+7+14 // 1,2,4,7,14는 각각 28의 약수

입력으로 자연수 N을 받고, 출력으로 N 이하의 모든 완전수를 출력하는 코드를 작성하라.

출처: https://codingdojang.com/scode/529?answer_mode=hide


[풀이]

N = 500
a = []

for num in range(N):
    lst=[]
    z = num + 1
    
    # 약수 구하기
    for i in range(z):
        if (z != (i+1)) & (z % (i+1) == 0):
            lst.append(i+1)

    if z == sum(lst):
        a.append(z)
    
a
[6, 28, 496]

사실상 약수만 구하면 전부 풀 수 있는 문제이다.

N 이하의 모든 완전수를 구해야해서 for문을 2번 사용헀지만 특별한건 없다.


[추천 풀이]

num= int(input("숫자를 입력하시오 : "))
print([x for x in range(1, num+1) if x==sum(y for y in range(1, x) if x%y==0)])
숫자를 입력하시오 : 500
[6, 28, 496]

다른 분이 푸신 풀이 중 추천수가 많은 풀이이다.

표기만 좀 다르고 풀이가 거의 같으나 한줄 for문으로 간편하게 구현하였다.

a = [ num+1 for num in range(N) if (num+1) == sum( i+1 for i in range(num+1) if ((num+1) != i+1) & ((num+1) % (i+1) == 0) )]
a
[6, 28, 496]

나의 표기로 굳이 한줄 for문으로 만들어봤는데 추천 풀이와 다르게 for문 자체를 0으로 시작하다보니 가독성이 떨어진다.

Leave a comment