약수의 개수와 덧셈_Java

컴투루·2022년 6월 30일
0

프로그래머스 Lv.1

목록 보기
30/38

월간 코드 챌린지 시즌2

🔥 약수의 개수와 덧셈 🔥


👀 문제

두 정수 left부터 right까지의 모든 수 중에서 약수의 개수가 짝수인 수는 더하고, 홀수인 수는 뺀 수를 return하는 solution을 완성해보자.


✔️ 조건

  • 1 ≤ left ≤ right ≤ 1,000

👩‍💻 입력 & 🧙 출력

leftrightresult
131743
242752

🙋‍♀️ 풀이

class Solution {
    public int solution(int left, int right) {
        int answer = 0;
         
        while(left <= right){
            int n=0;
            for(int i=1;i<=left;i++){
                
                if(left%i==0){
                    n++;
                }
            }
            if(n%2==0){
                answer = answer + left;
            }else{
                answer = answer - left;
            }
            left = left+1;    
        }

        return answer;
    }
}

생각나는데로 그냥 쉽게 해결한 문제이다.

  1. left가 right보다 작거나 같을때까지 반복분을 돌린다.
  2. 그 안에서 현재 left의 약수의 개수를 n에 답아주고
  3. n의 짝/홀 여부에 따라서 answer에 더해주거나 빼주었다.

메모리: 81.4 MB, 시간: 12.14 ms


💬 다른 풀이

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;
    }
}

메모리: 74.7 MB, 시간: 0.03 ms

ㅎㅎㅎ 뭐야
문제를 풀기는 했지만 전혀 올바른 풀이가 아니었다...
while문이 아닌 for문으로 left가 right보다 작을때까지의 반복문을 돌려주었다.
그리고 Math.sqrt를 통해서 제곱수를 구해주었다.
i가 i의 제곱수로 나누었을때 0 이라면 answer에 i를 빼주었고
제곱수가 아니라면 더해주었다.

이 풀이의 핵심은 i가 제곱수라면 약수의 개수가 홀수 제곱수가 아니라면 약수의 개수가 짝수개라는 것이다.

profile
맘 먹으면 못할 게 없지

0개의 댓글