[2021-05-25] 약수의 개수와 덧셈

2021. 5. 25. 22:14코딩테스트

푼 시간 : 40분

언어 : 자바

 


 

https://programmers.co.kr/learn/courses/30/lessons/77884

 

코딩테스트 연습 - 약수의 개수와 덧셈

두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주

programmers.co.kr

 

재귀함수로 풀다보니 시간이 오래걸렸다

지저분한데 급해서 그냥 풀었다.

 

막상 남들 푼걸 보니 재귀가 없어도 되는 문제였다...

너무 어렵게 생각하려는 습관이 문제인 것 같다.

후배들 보면서도 하는 생각인데 나도 결국

똑같이 어렵게 연산하는길을 택하는경우가 많은 것 같다..

 

class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        int[] count=new int[right-left+1];
        int temp=left;
        int sum;
        // 재귀함수에 넣을 약수 개수의 합
        int count_sum;
        // 재귀함수에 넣을 약수 카운터
        
        for(int i=0; i<count.length; i++){
            count_sum=1;
            // 약수는 1부터
            sum=0;
            count[i]=cal(left+i, sum, count_sum);
            // 약수 개수를 넣을 카운트, cal함수로 숫자하나당 재귀함수를 연출시킴
        }
        
        for(int i=0; i<count.length; i++){
            if(count[i]%2==1){
                answer+=temp;
                temp++;
                // 짝수면 더하기(count[i]가 0부터라서)
            }
            else{
                answer-=temp;
                // 홀수면 빼기
                temp++;
            }
        }
        
        return answer;
    }
    
    public int cal(int n,int sum, int count){
        if(n==count)
        // count가 left의 값과 같아지면 끝낸다.
            return sum;
        else if(n%count==0)
        // 카운트가 n(left)의 값의 약수일경우 sum을 더하며 리턴
            return cal(n, ++sum, ++count);
        else
        // 약수가 아닐경우 그냥 더한다.
            return cal(n, sum, ++count);
    }
}

 

'코딩테스트' 카테고리의 다른 글

[2021-05-28] 폰켓몬  (0) 2021.05.28
[2021-05-27] 두 개 뽑아서 더하기  (0) 2021.05.27
[2021-05-05] 소수 찾기  (0) 2021.05.05
[2021-05-03] 음양 더하기  (0) 2021.05.03
[2021-05-01] 모의고사  (0) 2021.05.01