[CodingTest] 약수의 합

hye·2023년 2월 5일
0

AlgorithmTest

목록 보기
3/95

📖 Exam

문제 설명

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

제한사항

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

입출력 예

  • 112의 약수는 1, 2, 3, 4, 6, 12입니다. 이를 모두 더하면 28입니다.
  • 25의 약수는 1, 5입니다. 이를 모두 더하면 6입니다.
nreturn
1228
56

✍ Answer

class Solution {
    public int solution(int n) {
        int answer = 0;
       
        for(int i = 1; i<=n ; i++){
            if(n % i == 0){
              answer = answer + i; 
            }
        }
            
        return answer;
    }
}

💡 Realization

  • 제한사항 참조
    제한 사항에서의 n = 0 일 때 경우의 수는 for 문 자체가 성립되지않기때문에 바로 0으로 return 된다.
class Solution {
    public int solution(int n) {
        int answer = 0;
       
            for(int i = 1; n<i ; i++){

                if(n % i == 0){
                    i = i;
                }else{
                    i = 0;
                }
    
                answer = answer + i;
            }
            
        return answer;
    }
}
  • 멍청 했던 논리 ERROR 1
    i는 무한히 증가하는 수이기때문에 미지의 수의 n보다 계속 클 수 밖에 없다.
    무한 에러가 발생하는 실수를 저지름.
    (물론 n 을 i보다 작은 수 넣으면 모르겠지만.. 그러지않을꺼니까)
  • 멍청 했던 논리 ERROR 2
    if문에서는 i가 i 입력된 i값으로 출력되고, else문에서는 i가 0값으로 출력된다.
    for문 조건 안에 있는 if문과 else문에 따라 for문 안의 i값이 0으로 초기화되며,
    이에 따라 for문 마지막에는 i의 값은 i 또는 0이 되는데 그게 위에 for를 다시 돌리게 되면
    약수가 나오지않을 때까지 for문이 돌다가 else를 만나는 순간 0으로 초기화 되어서
    i = 0으로 다시 for문이 시작하게 된다. 그리하여 무한 에러가 발생하는 실수를 저지름.

* 다른 해답

  • 곱근으로 계산하게 되면 효율적인 로직이 가능해진다.
     public int sumDivisor(int num) {
        int answer = 0;
            for(int i = 1; i <= num/2; i++){
        if(num%i == 0) answer += i;
      }
        return answer+num;
    }
profile
Junior Backend Developer

0개의 댓글