BOJ_9506 약수들의 합
- TOC {:toc}
이 글은 백준 온라인 저지의 9506번 문제를 파이썬(Python)으로 풀이한 것을 모아놓은 글입니다.
일종의 연습 기록이며 제가 정답을 받은 코드와 참고할만한 다른 코드를 같이 기록합니다. 필요한 경우 코드에 대한 해설을 기록합니다만 코드는 통과했어도 해설은 틀릴 수 있기 때문에 가볍게 참고해주시길 부탁드립니다. 피드백은 편하신 방법으로 자유롭게 주시면 감사하겠습니다.
2021.03.27
메모리 | 시간 | 코드 길이 |
---|---|---|
28776 KB | 68 ms | 322 B |
while True:
n = int(input())
if n == -1:
break
r = int(n ** 0.5)
f = [1]
for i in range(2, r + 1):
if not n % i:
f.extend([i, n // i])
f.sort()
if sum(f) == n:
print(f"{n} = {' + '.join(map(str, f))}")
else:
print(f"{n} is NOT perfect.")
아이디어 & 풀이
주어진 수의 제곱근까지 반복하면서 약수와 그 짝 약수를 리스트에 추가한 뒤 리스트 원소를 join
으로 사이에 +
를 넣어 묶어 출력한다.
- 여러 원소를 기존의 리스트에 추가할 때는
extend
를 이용한다.- 파이썬 파트14. 리스트 더 알아보기 by 초보몽키의 개발공부로그
- 원소를
join
으로 묶을 때 모든 원소가 문자열이어야 하므로map
을 이용해 각 원소를str
로 변환해준다.- python int형 리스트 join하기 by 최혜선 - Not First But Best
- str.join() by Python Documentation
1은 모든 수의 약수이면서 항상 n % i == 0
이 성립하기 때문에 약수 배열을 초기화할 때 미리 넣어준다.
참고 답안
while True:
L = []
n = int(input())
if n == -1:
break
for x in range(2, int(n ** (1 / 2)) + 1):
if n % x == 0:
L.append(x)
L.append(n // x)
# 정수 제곱근을 가지면서 완전 수인 수가 없어서 적지 않아도 문제는 되지 않았는데
# 실제로 정수 제곱근을 가지면 같은 수가 리스트에 두 번 입력되므로 하나를 제거해주어야 한다.
if n % (n ** (1 / 2)) == 0:
L.remove(int(n ** (1 / 2)))
# 반복문을 이용한 순차 출력
if sum(L) + 1 == n:
print("{} = 1".format(n), end="")
for x in sorted(L):
print(" + {}".format(x), end="")
print("")
else:
print("{} is NOT perfect.".format(n))
아이디어 & 풀이
완전 수를 출력할 때 strip()
과 replace()
를 사용할 수도 있다.
print(n, "=", str(sorted(L)).strip("[, ]").replace(", ", " + "))
-
ps-python