백준 9506번 풀이

문제

어떤 수가 완전수이면 약수들의 합으로 표현하고, 아니면 아니라고 출력하면 된다.

풀이

이 문제 또한 while True:를 써야 한다. 그 전에 완전수가 뭐냐고? 자기 자신을 뺀 모든 약수들의 합이 자기 자신과 동일한 수를 완전수라고 한다. 참고로 예전에 이거 판별하는거 코딩한거 깃헙에 있다.

https://github.com/koreanraichu/Python/blob/master/perfectnumber.py

아무튼 이 문제가 어려운건 단순히 완전수 로직때문이 아니라 출력때문… 완전수 로직은 쉽다. 자기 자신을 제외한 모든 약수들의 합이 자기 자신과 같다는건 약수 전체 합이 자기 자신의 두배라 이거거든.

import sys

while True:
    N = int(sys.stdin.readline())
    if N == -1:
        break

일단 이게 while True 나가는 조건인건 아시겠죠? 이 다음꺼 훅 들어오니까 대비 잘하시고.

import sys

while True:
    N = int(sys.stdin.readline())
    if N == -1:
        break
    # 나갓! 
    
    yaksu_list = []
    for i in range(1, N+1):
        if N % i == 0:
            yaksu_list.append(i)
    # 약수 픽

    sum_yaksu = sum(yaksu_list)
    yaksu_template = " + ".join(map(str,yaksu_list[:-1]))

    if sum_yaksu == 2 * N:
        print("{} = {}".format(N, yaksu_template))
    else: 
        print("{} is NOT perfect.".format(N))

노션에 복붙했는데 탭 안지워져서 걍 한번에 썼다. 약수 리스트에 넣는것까지는 아실 듯 하니 그 밑에걸로 바로 넘어가자. 어떤 수가 완전수이면 k = 1 + m + n 이런 식으로 자기 자신을 제외한 약수들의 합으로 나타내야 한다. 근데 약수 개수가 암만 완전수여도 수바수인데 어떻게요? 맨 뒤에꺼 빼고 자르면 되지. 그래서 -1로 슬라이싱하고 ‘ + ‘로 조인 멕였다.

여기서 중요한건 약수 목록에 들어간 게 int라 바로 join이 안된다. 그래서 map으로 문자열로 변환한 다음 join했다는 거… 이거 빼먹으면 로직은 맞는데 오류나서 안됩니다 여러분. 그리고 완전수 판정 로직은 위에도 썼듯 자기 자신을 제외한 모든 약수의 합이 자기 자신과 같다=약수 싹 더하면 두배라 저렇게 한거임.