Adventure Time - Jake [백준/python] 9506 약수들의 합: print()의 sep옵션, 언패킹(unpacking, *) / join기능
본문 바로가기
Back-end/백준(python)

[백준/python] 9506 약수들의 합: print()의 sep옵션, 언패킹(unpacking, *) / join기능

by bogyoi 2023. 10. 25.

 

 

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=' + '를 설정해주었다

 

*의 역할

  1. 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.")

 

출처 https://tturbo0824.tistory.com/35

 

" + ".join(str(i) for i in arr)

 

'구분자'.join(리스트) 형태로 사용.

 

join함수는 매개변수로 들어온 리스트에 있는 요소 하나하나를 합쳐서 하나의 문자열로 바꾸어 반환하는 함수이다.