본문 바로가기
코딩테스트/백준

백준 > 단계별로 풀어보기 > 약수, 배수와 소수 > 9506번: 약수들의 합

by 나는야석사 2024. 7. 22.

문제

어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다.

예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다.

n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.

입력

입력은 테스트 케이스마다 한 줄 간격으로 n이 주어진다. (2 < n < 100,000)

입력의 마지막엔 -1이 주어진다.

출력

테스트케이스 마다 한줄에 하나씩 출력해야 한다.

n이 완전수라면, n을 n이 아닌 약수들의 합으로 나타내어 출력한다(예제 출력 참고).

이때, 약수들은 오름차순으로 나열해야 한다.

n이 완전수가 아니라면 n is NOT perfect. 를 출력한다.

예제 입력 1 복사

6
12
28
-1

예제 출력 1 복사

6 = 1 + 2 + 3
12 is NOT perfect.
28 = 1 + 2 + 4 + 7 + 14

 

while True:

    lst = []
    n = int(input())

    if n <= 0:
        break

    for i in range(n):
        if n % (i+1) == 0:
            lst.append(i+1)

    lst = lst[:-1]

    if sum(lst) == n:
        # for i in lst:
        #     # print(f"{i}", sep="")
        print(f"{n} =", end=" ")
        print(*lst, sep=" + ")
    else:
        print(f"{n} is NOT perfect.")

 

마지막에 완전수를 출력해주는 부분에서 애를 먹었던 문제.. 결국 검색했다.

*리스트는 완전 잊고 있었다.

*list

리스트를 일렬로 출력해준다.

print(f"{n} =", end=" ")
print(*lst, sep=" + ")

end 옵션을 사용하면 그 뒤의 출력값과 이어서 출력한다. 즉, 줄바꿈을 하지 않게 된다.

sep 옵션을 사용하면 그 뒤의 출력값과 분리하여 출력한다. sep= 뒤에 해당하는 문자로 출력값들을 분리한다.

 

코드 작성 시에 n까지 순회를 하지 않았어도 됐다. 결국 [:-1]로 빼줬으니까 말이다.

전체적인 로직은 맞게 짜는 듯! 이 정도는 쉽다.. ㅎㅎ 하지만 출력하는 부분에 있어서 공부를 더 해야겠다.