백준 [9506.약수들의 합] | Python
✏️ 문제
https://www.acmicpc.net/problem/9506
9506번: 약수들의 합
어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다. 예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다. n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.
www.acmicpc.net
✏️ 풀이방법
1. 테스트케이스를 수행하다 입력된 값이 -1이라는 조건식을 만족할 때 실행을 멈추어야하기 때문에 for문이 아닌 while문 사용
2. 입력된 값을 입력된 범위까지의 모든 수로 나눴을 때 나머지가 0일경우 약수이므로 해당 조건을 만족하는 원소를 갖는 리스트(divisor)를 생성
3. 리스트(divisor)안에 있는 값을 sum함수의 총합이 입력된 값과 같을 때와 같지 않을 때로 구분
4. 리스트(divisor)안에 있는 값은 자기 자신을 나눈 값도 포함되어 있기 때문에 divisor[:-1]까지 마지막 원소를 제외한 값의 총합을 계산
5. 출력 형식에 맞춰 출력
📌 코드
while True:
n = int(input())
divisor = []
if n == -1:
break
for i in range(1,n+1):
if n % i == 0:
divisor.append(i)
if sum(divisor[:-1]) == n:
print(n,'='," + ".join(str(divisor[i]) for i in range(len(divisor)-1)))
else:
print(n,'is NOT perfect.')
📌 결과
# 입력
6
12
28
-1
# 출력
6 = 1 + 2 + 3
12 is NOT perfect.
28 = 1 + 2 + 4 + 7 + 14
🤔 시행착오.1
while True:
n = int(input())
divisor = []
sum = 0
if n == -1:
break
for i in range(1,n+1):
if n % i == 0:
divisor.append(i)
print(sum(divisor[:-1][0]))
Traceback (most recent call last):
File "C:\Users\PycharmProjects\pythonProject\main.py", line 291, in <module>
print(sum(divisor[:-1][0]))
^^^^^^^^^^^
TypeError: 'int' object is not callable
- 예약어를 변수명으로 사용해서 발생하는 에러이다.
- sum 함수를 사용하기 전에 위에 변수명으로 sum을 선언해버렸다. 예약어는 변수명으로 사용하지 않는 것이 좋다.
🔎 다른 풀이
while True:
n = int(input())
if n == -1:
break
else:
total = 0
divisor = []
for i in range(1, n//2 + 1):
if n % i == 0:
total += i
divisor.append(i)
if n == sum(divisor_list):
print(n, '=', end=' ')
print(*divisor, sep=' + ')
else:
print(n, 'is NOT perfect.')
- for i in range(1, n//2 +1) 로 범위를 설정하면 시간 복잡도를 절반으로 줄일 수 있다.
- n의 약수는 자기 자신을 제외하면 n의 절반가지가 모든 약수를 구할 수 있기 때문이다.
- *divisor의 *은리스트 요소를 한번에 출력하게 해준다. Asterisk(*)를 사용하여 리스트의 대괄호를 한번에 제거가능
- print(divisor) 대괄호 있게 리스트 출력, print(*divisor) 대괄호 없이 리스트 원소 출력
📒 다시보기
[Python] 05. 파이썬 문자열/리스트 관련 메소드
문자열 관련 메소드 1) 대소치환(upper(),lower(),title()) 문자열.upper() : 문자열을 대문자로 치환 문자열.lower() : 문자열을 소문자로 치환 문자열.title() : 문자열 앞글자만 대문자로 치환 a1 = 'abc de12! cAA
somin0416.tistory.com
[Python] 17. 리스트 원소를 한 줄로 출력하기
보통 for문으로 원소를 출력하면 다음과 같다. 아래와 같이 하나씩 출력된 후 개행문자가 포함되는 것이 아닌 가로로 한 줄에 출력하고자 한다. ex_list = [1,2,3,4,5] for i in ex_list: print(i) #출력 1 2 3 4 5
somin0416.tistory.com