[Programmers] [Lv.1] [Swift] 약수의 개수와 덧셈

doyeonjeong_·2022년 8월 16일
0

프로그래머스

목록 보기
30/35
post-thumbnail

문제

약수의 개수와 덧셈

문제파악하기

  • 주어진 leftright 사이의 수를 탐색하여 약수의 수를 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 { // i의 약수 카운트
                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

profile
블로그 이사중 🚚 byukbyak.tistory.com

0개의 댓글