import sys
while(1):
arr=[]
n=int(sys.stdin.readline())
if n==-1:
break
for i in range(1, n): #자신을 제외한 약수이므로 i의 범위는 n-1까지
if n%i==0:
arr.append(i)
if sum(arr)==n: ###################
print(n,'=',end=' ')
print(*arr, sep=' + ')
else:
print(n, 'is NOT perfect.')

다른 코드 짜는 것들은 쉬웠는데
완전수일떄의 약수들의 합을 출력하는 포맷을 어떻게 해야할지 어려웠음.
print() 안에서 for-loop을 짜야하나..?? 라는 고민도 했음( arr[0], arr[1],..이런식으로 for루프를 돌며 arr의 모든 원소들을 출력해주게)
구분자인 sep라는 옵션이 있었음,
print('S','E','P',sep='0')
위의 코드를 실행한다면 출력은 >>> S0E0P
그래서 구분자로 sep=' + '를 설정해주었다
*의 역할
- Unpacking의 역할 : 괄호 안에 있던 데이터를 풀어 각각으로 만들어줌

리스트[]뿐만 아니라 튜플() 타입과 딕셔너리{}타입 또한 똑같이 언패킹 가능. 참고로 딕셔너리 같은 경우에는 key값들로 풀어짐.
2. 가변인자( *arg, **kwargs)
가변 인자를 처리하는 표현으로 들어오는 인자의 개수를 모른다거나, 그 어떤 인자라도 모두 받아서 처리를 해야 할 때 주로 사용. def print_info(*args): ...과 같은 형태.
위 경우는 1번의 언패킹 기능을 사용한것이다.
n=6으로 입력했을 경우
print(arr) >>>[1, 2, 3]
print(*arr) >>>1 2 3
print(*arr, sep=' + ') >>>1 + 2 + 3
print(arr, sep=' + ') >>>[1, 2, 3]
으로 나온다!
또 다른 사람은 아래와 같이 join을 이용한 것을 볼 수 있었따.
while True:
n = int(input())
if n == -1: # 입력 값이 -1이면 반복문 종료
break;
arr = []
for i in range(1, n):
if n % i == 0:
arr.append(i)
if sum(arr) == n:
print(n, " = ", " + ".join(str(i) for i in arr), sep="")
else:
print(n, "is NOT perfect.")
" + ".join(str(i) for i in arr)
'구분자'.join(리스트) 형태로 사용.
join함수는 매개변수로 들어온 리스트에 있는 요소 하나하나를 합쳐서 하나의 문자열로 바꾸어 반환하는 함수이다.
'Back-end > 백준(python)' 카테고리의 다른 글
[백준/python] 2580 소수: 1트 코드 왜 틀렸었던걸까 (0) | 2023.10.25 |
---|---|
[백준/python] 1978 소수찾기: (0) | 2023.10.25 |
[백준/python] 2501 약수 구하기: (0) | 2023.10.25 |
[백준/python] 2563 색종이: 정사각형 넓이 구하기/ 얕은 복사에 대하여 (1) | 2023.10.24 |
[백준/python] 10798번 세로 읽기: (0) | 2023.10.24 |