[프로그래머스/LV.1] 약수의 개수와 덧셈
문제 설명
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ left ≤ right ≤ 1,000
입출력 예
left right result
13 | 17 | 43 |
24 | 27 | 52 |
입출력 예 설명
입출력 예 #1
- 다음 표는 13부터 17까지의 수들의 약수를 모두 나타낸 것입니다.
13 | 1, 13 | 2 |
14 | 1, 2, 7, 14 | 4 |
15 | 1, 3, 5, 15 | 4 |
16 | 1, 2, 4, 8, 16 | 5 |
17 | 1, 17 | 2 |
- 따라서, 13 + 14 + 15 - 16 + 17 = 43을 return 해야 합니다.
입출력 예 #2
- 다음 표는 24부터 27까지의 수들의 약수를 모두 나타낸 것입니다.
24 | 1, 2, 3, 4, 6, 8, 12, 24 | 8 |
25 | 1, 5, 25 | 3 |
26 | 1, 2, 13, 26 | 4 |
27 | 1, 3, 9, 27 | 4 |
- 따라서, 24 - 25 + 26 + 27 = 52를 return 해야 합니다.
내 답안
import math
def solution(left, right):
total=[]
for i in range(left,right+1):
sq=math.sqrt(i)
if i%sq == 0:
total.append(-i)
else:
total.append(i)
answer = sum(total)
return answer
왜 갑자기 append 쓰는거에 맛 들렸지...?
한 우물 만 파는게 아니라 한 우물 밖에 못파는 느낌..ㅎ
하여튼 알고리즘은 이렇다.
보통 자연수의 약수의 개수는 짝수다.
홀수가 되는 경우는 제곱값일 경우,
즉 자기 자신을 약수로 가질때이다.
여기서 착안하여 제곱값, 제곱근(sqrt)과 관련된 수를 이용해야하니
math 모듈을 데려오고 시작한다.
left ~ right 범위의 수 i를 탐색!
(range 사용시 우측범위값엔 +1 하는것 주의)
주어진 수의 제곱근 값인 math.sqrt(i) 를 sq라는 변수에 저장하고
i를 sq(=i의 제곱근값) 나누었을때 나머지가 0인 경우를 구한다.
이 case는 약수의 개수가 홀수일때이므로
-i 를 total 배열에 추가한다.
이외의 case는 모두 약수의 개수가 짝수인 경우다. (else)
이때는 i 값을 그대로 total 에 추가한다.
최종적으로 total 배열 내 값들의 총합을 구하고 반환한다.
다른사람 풀이 #1
def solution(left, right):
answer = 0
for i in range(left,right+1):
if int(i**0.5)==i**0.5:
answer -= i
else:
answer += i
return answer
저기 저 * 은 뭐여,, 주석인가...? .... ☆★ 싶었는데 아니다.
다 기능이 있는 놈이었다는거.
이름은 Asterisk.. 어캐 읽냐면 ㅇ ㅐ-슽터리스크
뜻은 별표(*) 다 ㅎㅎ... 그냥 이름이 곧 의미. 이곧의....
하여튼 얘가 뭔 역할을 하냐?
>>> 2 * 3
6
>>> 2 ** 3
8
* 하나 붙이면 단순 곱셈 (2 x 3)
** 두개 붙이면 거듭제곱 (2^3)
그 외에도 이 별표는 여기저기 쓰이지만,,
그건 나중에 ..
i**0.5는 결국 루트 i 니까!
제곱근이랑 같은 의미다.
모듈을 따로 안불러와도 쓸수 잇군앙!
나처럼 append로 굳이굳이 한군데에 담기보다
그때그때 answer 변수값을 변화시켜 답을 도출하는 과정을 택하셨다.
이게 더 간편하고 짧긴한데..
+=, -= 이 연산자가 가끔 헷갈린다 난 ㅎ 무서웡
담에는 저렇게 풀오봐야지!!
점점 내 풀이가 다른사람들 풀이와 와꾸가(?) 비슷해지는거같아 뿌듯하다
빨리 레벨업 해야지~~~!