문제
약수의 개수와 덧셈
문제파악하기
- 주어진
left
와 right
사이의 수를 탐색하여 약수의 수를 count하고
그 수가 짝수라면 더하기, 홀수라면 빼는 알고리즘이다.
풀이
import Foundation
func solution(_ left:Int, _ right:Int) -> Int {
var answer = 0
for i in left ... right {
var count = 0
for j in 1...i {
if i % j == 0 {
count += 1
}
}
if count % 2 == 0 {
answer += i
} else {
answer -= i
}
}
return answer
}
🤔 FEEDBACK
- 처음엔 함수를 만들어서 각 수의 약수를 배열로 반환했고 길이로 판단했다.
- 나름대로
sqrt
를 써서 시간복잡도를 줄여 구해보겠다는 발상이었는데
아무리 봐도 이렇게 복잡하게 풀 문제가 아니다 싶어서 문제를 다시 봤다.
- 약수의 개수가 짝수인지 홀수인지만 알면되니까 count가 낫겠다 싶어 방향을 바꿨다.
다른 풀이
func solution(_ left: Int, _ right: Int) -> Int {
return (left...right).map { i in (1...i).filter { i % $0 == 0 }.count % 2 == 0 ? i : -i }.reduce(0, +)
}
- 난 언제 이렇게 고차함수를 능수능란하게 써보지...
- left부터 right까지 한번에 map을 사용해서 반복해준다. -> Array 생성
- i를 Array에 넣어줄건데 이 i는 1부터 i까지 나눠지는 수일때만 담은 배열의 길이를 카운트
- 그래서 그게 짝수면 그냥 정수로 넣어주고 홀수면 음수로 넣어준다.
- 최종적으로 filter에 걸러진 배열의 총 합을 구한다.
- 아마 map, filter, reduce까지 써서 효율적인 코드는 아닐거라 예상하지만..
- 그래도 고차함수를 잘 다룰 수 있고 많이 풀지 않는 방식이라 높은 점수 받았을 것 같다.
Reference