[프로그래머스 Lv.1] - 약수의 합

김주형·2022년 9월 28일
0

알고리즘

목록 보기
7/29

출처

🙇🏻‍♂️

약수의 합


문제 설명

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

제한 사항

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

입출력
nreturn
1228
56

입출력 예 설명

  • 입출력 예 #1
    12의 약수는 1, 2, 3, 4, 6, 12입니다. 이를 모두 더하면 28입니다.
  • 입출력 예 #2
    5의 약수는 1, 5입니다. 이를 모두 더하면 6입니다.
class Solution {
    public int solution(int n) {
        int answer = 0;
        
        for(int i=1; i <= n; i++){
            if (n%i == 0){
                answer += n/i;
            }else{
                continue;
            }
            
        }
    
        return answer;
    }
}

제어 흐름

  1. 1부터 입력받은 정수 n이하의 크기까지 반복하여 증가하는 수 i 정의
  • i의 증가값이 입력받은 정수에 도달하면 반복문 종료
  1. n을 i로 나누었을 때 나머지가 없는 지 여부로 약수 판단
  • 나머지가 존재하는 경우엔 건너뛰고(continue) 반복문 재개
  1. 현재 answer 변수 상태: 약수 여부가 참일 경우, 약수의 합을 구하는 answer 변수에
    "입력받은 정수를 i로 나눈 결과값을 저장"하는 것을 반복문 종료시 까지 반복하여 할당한 상태
  2. 1부터 n까지 n의 약수들을 합한 데이터들이 저장되어있는 변수 answer가 정상적으로 반환되는지 확인하기 위해 테스트 실행을 통하여 검증

test


리팩토링 - 이게 최선인가..?

  1. 나눗셈의 나머지 존재 여부로 약수를 판단했다.
    -> "정수 n을 2로 나누었을 때 0 or 아니다"와도 동일하다.
    -> 가장 작은 약수는 2임을 의미한다고 생각했다.
  2. 1을 통해 i의 증감이 반복하는 동작은 n까지 도달하지 않고,
    절반까지만 도달해도 충분하다. 즉, 최대공약수로의 도달은 불필요하다는 것을 알게 되었다.
  3. 내부적으로 최소 1번 이상의 불필요한 실행을 최소화할 수 있지 않을까?
  4. 또한 else문과 continue문도 불필요해보여 제거하고
    이미 0으로 초기화 되어있는 다음 수들을 더하여 반환시켰다.
  • answer : 0
  • i : n의 절반까지 증가하며 동시에 n의 약수
  • n : 최초에 입력받은 정수(즉, 최대공약수)
class Solution {
    public int solution(int n) {
        int answer = 0;
        
        for(int i=1; i <= n/2; i++){
            if (n%i == 0){
                answer += i;
            }
        }
    
        return answer+n;
    }
}

테스트 실행 결과는 동일했다.

profile
근면성실

0개의 댓글