반응형

출처 : https://programmers.co.kr/learn/courses/30/lessons/77884?language=java 

 

문제 설명

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

 

나의 풀이

    public int solution(int left, int right) {
        int answer = 0;

        for(int i=left; i<=right; i++){
            if(Math.ceil(Math.sqrt(i)) == Math.floor(Math.sqrt(i))){
                answer -= i;
            }else{
                answer += i;
            }

        }
        return answer;
    }

접근

(수학적으로 생각해보면) 약수의 개수가 홀수라면 소수이다.

따라서 해당 숫자의 제곱근이 자연수라면, 약수의 개수가 홀수개 이고, 그럴 경우에 값을 빼주고

나머지 숫자는 더하도록 구상

다른 사람의 풀이

    public int solution(int left, int right) {
        int sum = 0;
        for (int i = left; i <= right; i++) {
            sum += i * ((countDenominators(i) % 2 == 0) ? 1 : -1);
        }
        return sum;
    }
    private int countDenominators(int num) {
        int count = 0;
        for (int i = 1; i <= num; i++) if (num % i == 0) count++;
        return count;
    }

오랜만에 나의 풀이가 꽤 좋은 평가를 받는 축이었다.

대부분은 중첩 for문을 사용해서 직접 해당수의 약수를 직접 구해서 판단하는 로직이었다.

느낀점

  • 도메인에 대한 지식의 중요성 : 해당 분야에 대해 알고 있다면, 생각보다 빠르고 쉬운 풀이를 알 수 있다
  • 자연수(정수)를 판단하는게 의외로 잘 생각이 나지 않아 올림/내림을 사용했는데 좋은 방법이 있다
    i % Math.sqrt(i) == 0

 

반응형

+ Recent posts