Programmers

[iOS Swift] Lv.1 약수의 합

pockpock 2024. 5. 8. 20:29
출처 : 프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/12928
난이도: Lv.1

 

문제 설명

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

 

제한사항

  • n 은 0 이상 3000이하인 정수입니다.

입출력 예

n return
12 28
5 6

 


1. 내가 짠 코드

func solution(_ n: Int) -> Int {
    var sum: Int = 0

    if n >= 0 && n <= 3000 { // 제한 사항 조건1
        for i in 1...n {
            if n % i == 0 {  // 약수 구하기
                sum += i     // sum에 약수의 합을 저장
                print(i)     // 약수 출력해서 확인
            }
        }
        return sum           // sum을 리턴
    } else {
        return 0             // 위 조건에 부합되지 않을 경우 0을 리턴
    }
}

 

오류란다.. 왜!! why!! 이유를 찾기 위해 구글링을 해봤더니

  •  index out of range(활용한 인덱스 범위 연산자가 초과함.)
  • 옵셔널에서 nil값에 의한 오류.

라고 하는데, 솔직히 아직 잘 모르겠다 제한 사항 조건에 부합하고, 약수값도 출력해서 확인 완료했다.

 

흠흠.. 도저히 모르겠고 답답해서 다른사람 풀이를 봤다

2. 정답코드

func solution(_ n:Int) -> Int{
    var sum : Int = 0
    
    if n>0{
        for i in 1...n{
            if n % i == 0 {
                sum += i
            }
        }
        return sum
    }
    return 0
    
}

내 코드랑 다른게 뭐지? 오히려 제한 사항에 대해 내가 더 명확하게 적은거 아닌가?

내일 한번 더 확인 해야겠다.. ㅠㅠ

++++

3. 문제 해결

func solution(_ n: Int) -> Int {
    var sum: Int = 0

    if n >= 1 && n <= 3000 { // 제한 사항 조건1
        for i in 1...n {
            if n % i == 0 {  // 약수 구하기
                sum += i     // sum에 약수의 합을 저장
                print(i)     // 약수 출력해서 확인
            }
        }
        return sum           // sum을 리턴
    } else {
        return 0             // 위 조건에 부합되지 않을 경우 0을 리턴
    }
}

수정 한 점

if n >= 0 && n <= 3000  -> if n >= 1 && n <= 3000

 먼저, core dumped가 뜨는 시점이 nil이 발생 했다는 점을 생각해 봤을 때 swift는 공간?이 중요한 것 같다고 생각이 든다.

그래서 공간에 키워드를 맞추고 코드를 살펴 보았는데, 제한 사항에서 n은 0 이상 3000이하인 정수에만 꽂혔던 것 같다.

5번 째 라인을 보면 for문에서 n는 1부터 n까지라고 정의되어 있는데, if문에서 0이상 << 을 나타냄으로써 n이 0일 때 문제가 되는 것 같다.