스파르타 코딩 클럽 - iOS 스타터 6기/알고리즘 코드카타

33. 스파르타 코딩 클럽 - 6월 2일 코딩테스트 연습 (코드카타)

seongpil Heo 2025. 6. 2. 17:59

 ❓  오늘의 문제

1. 약수의 합

  • 정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해 주세요.
  • 제한 사항
    • n은 0 이상 3000 이하인 정수입니다.

예외 처리 이전 일반 방법
일반 방법
축약 방법

나의 정답 코드

// 방법 1 : 일반 방법
func solution(_ n:Int) -> Int {
    if n == 0 {
        return 0
    }
    
    var divNumList = [Int]()
    
    for i in 1...n {
        if n % i == 0 {
            divNumList.append(i)
        }
    }
    
    return divNumList.reduce(0, +)
}


// 방법 2 : 축약 방법
func solution(_ n:Int) -> Int {
    if n == 0 { return 0 }
    let divNumList = (1...n).filter { n % $0 == 0 }
    return divNumList.reduce(0, +)
}

  ✓  TIL

[ 처음 코드 ]

func solution(_ n:Int) -> Int {  
    var divNumList = [Int]()
    
    for i in 1...n {
        if n % i == 0 {
            divNumList.append(i)
        }
    }
    
    return divNumList.reduce(0, +)
}

 

처음 코드이다.

 

설명하면

1부터 주어진 n까지 반복문을 돌면서

n을 i의 값으로 나눈 나머지가 0일 때 (즉, 약수일 때) divNumList에 i 값을 추가한다.

 

그 후 return 부분에서 reduce를 사용해서 divNumList 안에 값들을 더해주고

더해진 값을 최종 return 한다.

 

여기서 잠깐 reduce가 무엇인가?

 

돌아온 공식 문서 Time
 

reduce(_:_:) | Apple Developer Documentation

Returns the result of combining the elements of the sequence using the given closure.

developer.apple.com

 

Swift의 reduce는 컬렉션의 모든 요소를 하나의 값으로 결합할 때 사용하는 고차 함수입니다.
예를 들어 배열의 합, 곱, 문자열 결합 등 여러 요소를 단일 값으로 축약할 때 사용됩니다.

 

[ reduce 기본 문법 ]

let result = array.reduce(initialResult) { partialResult, element in
    // 연산 내용
}

 

  • initialResult: 축약을 시작할 때 사용할 초기값
  • partialResult: 누적된 결괏값 (반복적으로 업데이트됨)
  • element: 현재 반복 중인 배열의 요소

 

[ reduce 사용 예시 ]

let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0) { $0 + $1 }
print(sum) // 출력: 15

 

  • 0: 초기값
  • $0: 이전까지의 합 (partialResult)
  • $1: 현재 요소 (element)

 

[ reduce 내 코드에서 사용 예시 ]

return divNumList.reduce(0, +)	// 초기값  : 0
				// + 의 의미 : $0 + $1 생략

 

[ 일반 방법 정답 코드 ]

func solution(_ n:Int) -> Int {
    if n == 0 {
        return 0
    }
    
    var divNumList = [Int]()
    
    for i in 1...n {
        if n % i == 0 {
            divNumList.append(i)
        }
    }
    
    return divNumList.reduce(0, +)
}

 

아래 트러블 슈팅에서 정리한 테스트 16번에서 발생한 제한 사항 관련 문제를 해결 한 뒤 코드이다.

 

문제를 해결하고 난 뒤 코드를 좀 더 짧고 간단하게 작성해 볼 수 있을 거 같아서

축약 방법으로 코드를 작성해 보았다.

 

[ 축약 방법 정답 코드 ]

func solution(_ n:Int) -> Int {
    if n == 0 { return 0 } // n 이 0일 때 예외 처리
    let divNumList = (1...n).filter { n % $0 == 0 } // 약수 구하기
    return divNumList.reduce(0, +) // 구한 약수들 다 더하기
}

 

filter를 사용해서 divNumList에 약수들을 구하고

reduce를 사용해서 구한 약수들을 다 더해주고 return 하는 방법의 코드를 작성했다.


  🎯  Trouble Shooting

[ 테스트 16번 에러 -  (signal: illegal instruction (core dumped)) ]

 

(signal: illegal instruction (core dumped)) 에러를 GPT에 물어봤더니

아래와 같은 문제점을 알려주었다.

 

 

문제는 내가 제한 사항을 참고하지 않고 그냥 코딩을 하다가 발생한 문제이다.

 

if n == 0 { return 0 } // n이 0일 때 예외 처리

 

코드를 추가해 주고 에러를 해결했다.


  😼  GitHub