Back-end/Algorithm

[프로그래머스] Lv1. 약수의 개수와 덧셈(java)

Nellie Kim 2023. 7. 12. 16:43
728x90

문제 설명

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


제한사항
  • 1 ≤ left  right ≤ 1,000

입출력 예

 

입출력 예 #1

  • 다음 표는 13부터 17까지의 수들의 약수를 모두 나타낸 것입니다.

내 풀이

import java.util.*;

class Solution {
    public int solution(int left, int right) {
        // 1. 수1~ 수2 사이동안 반복문
        // 2. 하나하나 돌 동안에 약수의 개수 구하는 함수만들기 boolean sol(int i) 짝수면 true
        // if(sol) == true면 더하고 홀수면 빼기
        int answer = 0;

        for (int i = left; i <= right ; i++) {
            if (sol(i)) {
                answer += i;
            }else {
                answer -= i;
            }
        }
        return answer;
    }

    public boolean sol(int num) {
        int cnt = 1;
        for (int i = 2; i <=num ; i++) {
            if (num % i == 0) {
                cnt++;
            }
        }
        if (cnt % 2 == 0) {
            return true;
        }
        return false;
    }
}

public class codingTest {
    public static void main(String[] args) {
        Solution solution = new Solution();

        System.out.println(solution.solution(13,17));

    }
}

sol이라는 함수를 별도로 만들어주었다.

수의 약수가 짝수면 true, 홀수면 false 를 반환하는 함수이다.

solution에서 가져다 쓰기 편했다.

뭔가 복잡해지는 것 같을 때는 따로 함수를 만드는게 제일 쉬운 것 같다 !!

 

다른 사람 풀이

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

        for (int i=left;i<=right;i++) {
            //제곱수인 경우 약수의 개수가 홀수
            if (i % Math.sqrt(i) == 0) {
                answer -= i;
            }
            //제곱수가 아닌 경우 약수의 개수가 짝수
            else {
                answer += i;
            }
        }

        return answer;
    }
}

 

좋아요를 제일 많이 받은 풀이이다.

제곱근으로 그 수를 나누게 되면 홀수가 나온다. 수학적인 지식? 음 직관력이라고 해야하나. 생각지도 못한 풀이였다.

나는 언제 저런 경지에 오를 수 있을지 모르겠다.