본문 바로가기

Algorithm

프로그래머스 - 약수의 개수와 덧셈

728x90

문제 설명 

문제

두 정수 left 와 right 가 매개변수로 주어집니다. left 부터 right 까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요. 

 

제한 사항

  • 1 ≤ left  right ≤ 1,000

 

입출력 예

left right result
13 17 43
24 27 52

 


해결 

import Foundation

func solution(_ left:Int, _ right:Int) -> Int {
    var result: Int = 0
    
    for n in left...right {
       let count = (1...n).map{$0}.filter{n%$0 == 0}.count
       result += count%2 == 0 ? n : -n
    }
    
    return result
}

 

해결 방안 설명 

먼저 두 가지 단계를 거쳐야 합니다.

1. left 와 right 사이의 수에 대해서 약수의 개수 구하기 

2. 약수의 개수가 짝수인 경우와 홀수인 경우 분기처리 하기 

 

입력된 두 개의 수 left 와 right 사이의 모든 수(= n)에 대해서 반복문을 수행합니다. 

사이의 수가 n일 때, n을 1부터 n까지의 수에 대해서 나누었을 때 나머지가 0인 수 (= 약수)를 count에 저장합니다. 

 

count는 n에 대한 약수의 개수를 의미합니다. 이 때 count가 짝수인 경우는 더하고 홀수인 경우는 빼서 result에 저장합니다.

 


다른 풀이

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 사이의 수 n에 대해서 n을 1부터 n까지의 수로 나눠 나머지가 0인 수를 count하고 짝수라면 양수의 값을, 홀수라면 음수의 값을 저장하고 reduce를 통해 더합니다. 

 

고차함수 활용을 잘하자.