알고리즘/알고리즘 풀이

[프로그래머스_1] 약수의 합 JAVA

데부한 2022. 6. 23. 23:50
반응형

 

 

코딩테스트 연습 - 약수의 합

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요. 제한 사항 n은 0 이상 3000이하인 정수입니다. 입출력 예 n return 12 28 5 6 입출력 예 설명 입출력 예 #1 12의 약수

programmers.co.kr

 

문제 설명

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

 

제한 사항

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

 

입출력 예

 

CODE

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

위의 코드가 처음 작성한 코드이다. 어렴풋이 책에서 봤던 알고리즘 코드가 떠올라 코드 자체를 외웠다기보다는 로직을 이해했어서 기억을 상기시키면서 코드를 작성했다. for문을 돌리며 n으로 나누어 떨어지는 i 값이 있으면 temp에 n / i 값을 담았다. 그리고 answer에 저장하기 전에 temp에 담긴 값이 i 보다 작으면 중복 저장이라 생각해 for문을 종료했다. 예를 들면, n이 12고 i가 3이라고 치자. 그럼 temp에는 12 / 3 = 4가 담길 것이고 조건을 통과해 answer에 담길 것이다. 그다음 i가 4일 때 temp에는 12 / 4 = 3이 담긴다. 3은 이미 이전에 더한 값이고, 이후에 나올 i들은 모두 전에 더한 값이기 때문에 종료시켰다.

이 상태로 뿌듯해하며 코드를 제출했더니 테스트 케이스 3개가 실패했다.

 

뭐가 문제일까 하다가 테스트 케이스에 추가로 1을 넣어봤더니 결괏값이 0이 나와버리는 사태가 발생했다.

코드를 분석해보니 for 조건식에 부등호가 '<'로 되어있어서 for문 자체가 돌지 않는 게 1차적인 문제였다. 그래서 부등호를 '<='로 수정해서 실행해봤더니 이제 결괏값이 2가 나왔다. temp에 1이 저장되어있고, i가 1.. 여기서 두 개를 더한 값을 answer에 저장하고 return 해서 2라는 값이 나온 거 같아 조건문을 하나 더 추가했다.

반응형
class Solution {
    public int solution(int n) {
        int answer = 0;
        int temp = 0;
        
        for(int i = 1; i <= n; i++) {
            if(n % i == 0) {
                temp = n / i;
                if(temp < i) break;
                if(temp == i) answer += i;
                else answer += i + temp;
            }
        }
        return answer;
    }
}

뭔가 if문이 덕지덕지 붙어있는 거 같지만 그래도 노력해서 푼 것 같아 뿌듯하다.

 

실행 결과

반응형