프로그래머스 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 Foundation
func solution(_ left:Int, _ right:Int) -> Int {
var re = 0
for i in left...right{
var cnt = (1...i).map{$0}.filter{i%$0 == 0}.count
cnt % 2 == 0 ? (re += i) : (re -= i)
}
return re
}
left부터 right까지 각 정수의 약수를 구한다.
filter 함수를 사용하여 1부터 i까지 정수를 나눴을 때, 나머지가 0인 경우의 수를 cnt 변수에 저장한다.
cnt 변수가 짝수라면 re 변수에 정수를 더하고, 아니라면 re 변수에서 정수를 뺀다.
다른 풀이
import Foundation
func solution(_ left:Int, _ right:Int) -> Int {
var answer = 0
for number in left...right{
if floor(sqrt(Double(number))) == sqrt(Double(number)) {
answer -= number
} else {
answer += number
}
}
return answer
}
정수가 제곱수인 경우에만 약수의 개수가 홀수이다.
따라서 정수의 제곱근을 구한 후, floor함수를 사용해 소수점 이하를 버렸을 때와 동일하다면(제곱근 값이 정수) answer 변수에서 정수를 뺀다.
아니라면 answer 변수에 정수를 더한다.
반응형
'📖 Coding Test > Programmers LV.1' 카테고리의 다른 글
[프로그래머스 LV.1] 부족한 금액 계산하기 (0) | 2023.03.06 |
---|---|
[프로그래머스 LV.1] 숫자 문자열과 영단어 (0) | 2023.03.05 |
[프로그래머스 LV.1] 로또의 최고 순위와 최저 순위 (0) | 2023.03.04 |
[프로그래머스 LV.1] 음양 더하기 (0) | 2023.03.04 |
[프로그래머스 LV.1] 신규 아이디 추천 (0) | 2023.03.03 |
댓글