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를 통해 더합니다.
고차함수 활용을 잘하자.
'Algorithm' 카테고리의 다른 글
백준 - 입출력과 사칙연산 (0) | 2022.08.17 |
---|---|
프로그래머스 - 나머지가 1이 되는 수 찾기 (0) | 2022.04.15 |
프로그래머스 - 두 개 뽑아서 더하기 (0) | 2022.04.12 |
BST(이진 탐색 트리) - 구현 (0) | 2022.04.01 |
BST (이진탐색트리) - 개념 (0) | 2022.04.01 |