문제

어떤 숫자 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

 

 

내가 한 틀린 코드

nl = []
ll = []

while True:
    n = int(input())

    if n == -1:
        break
        
    l = []
    
    for i in range(1,n+1):
        if n % i == 0:
            l.append(i)

    l.remove(l[-1])
    ll.append(l)
    nl.append(n)

for j in range(len(ll)):
    if nl[j] == sum(ll[j]):
        print(f"{nl[j]} = ", end = "")

        for k in ll[j]:
            if k == 1:
                print(f"{k}", end = "")

            else:
                print(f" + {k}", end = "")
    else:
        print()
        print(f"{nl[j]} is NOT perfect.")

 

이 코드는 정답이랑 똑같은 형식으로 출력되기는 하는데

출력되는 형식이 이렇게 되면 안되기 떄문에 틀린 문제이다.

한 줄에 하나씩 출력되도록 해야하는데 그렇게 하지 않았기에 틀린문제

 

그럼 어떻게 해야하나?

옛날에 썼던 적이 있는 것 같은데 요즘 안써서 까먹은 join을 써야한다.

join을 통해 반복문 사이에 있는 인자들을 +로 연결해준다는 생각을 해주면 이렇게 길게 코드를 쓰지 않아도 된다.

 

정답 코드

nl = []
ll = []

while True:
    n = int(input())

    if n == -1:
        break
        
    l = []
    
    for i in range(1,n+1):
        if n % i == 0:
            l.append(i)

    l.remove(l[-1])
    ll.append(l)
    nl.append(n)

for j in range(len(ll)):
    if nl[j] == sum(ll[j]):
        temp = ' + '.join(str(i) for i in ll[j])
        print(f"{nl[j]} = {temp}")

    else:
        print(f"{nl[j]} is NOT perfect.")

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

백준 파이썬 - 2869  (0) 2024.02.02
백준 파이썬 - 2292  (0) 2024.01.30
백준 파이썬 - 2903  (1) 2024.01.30
백준 파이썬 - 2720  (1) 2024.01.29
백준 파이썬 - 2745  (1) 2024.01.29

+ Recent posts