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