
문제 설명
두 정수 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 해야 합니다.
제출 코드 1
def solution(left, right):
result = 0
num = [x for x in range(left, right+1)]
su = []
for i in range(left, right+1):
n = []
for j in range(1, i+1):
if i%j == 0:
n.append(j)
su.append(len(n))
for i in range(len(su)):
if su[i]%2 == 0:
result += num[i]
else:
result -= num[i]
return result
처음에는 단순히 약수를 구해 리스트에 넣고, 약수 리스트에서 홀짝을 다시 구해 덧셈을 해주었다. 하지만 코드가 너무 복잡하고 하나의 함수 안에 반복문이 3개나 들어가고 있어서 좀 더 간결하게 할 수 있는 방법을 찾았다.
제출 코드2
def solution(left, right):
result = 0
for i in range(left, right+1):
cnt = 0
for j in range(1, i+1):
if i%j == 0:
cnt += 1
if cnt%2 == 0:
result += j
else:
result -= j
return result
처음 제출한 코드보다 간결해졌다. 홀짝을 구하는 반복문을 따로 나누지 않고, 처음 반복하던 for문에서 바로 홀짝을 판별했다. 두번째도 완벽하다고 볼 수는 없지만 약수 개수를 구할 때 머리를 복잡하게 사용하지 않고 간단하게 쓸 수 있어 보인다.
'CodingTest > programmers' 카테고리의 다른 글
[프로그래머스] 문자열 내 마음대로 정렬하기 -python (0) | 2024.12.31 |
---|---|
[프로그래머스] 이상한 문자 만들기 - python (0) | 2024.12.30 |
[프로그래머스] 정수 내림차순으로 배치하기 - python (0) | 2024.12.24 |
[프로그래머스] 자연수 뒤집어 배열로 만들기 -python (1) | 2024.12.24 |
[프로그래머스] 배열의 평균값 - python (0) | 2024.12.24 |