[프로그래머스]_Lv1_약수의 개수와 덧셈 by Java

TONYLEE·2022년 8월 15일
0

프로그래머스_lv1

목록 보기
2/3

2022/08/15

문제

  • 프로그래머스_lv1 약수의 개수와 덧셈

🌈 문제링크

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


👨‍💻 첫인상

  • 비슷한 문제를 대학교 시절 많이 풀었던 기억이 있었다.
    그래서 따로 수학적 원리를 생각하기보다 손으로 먼저 풀어보았다.

📖 문제

문제 설명

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

제한사항

1 ≤ left ≤ right ≤ 1,000

입출력 예

leftrightresult
131743
242752

입출력 예 설명

입출력 예 #1

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

약수약수의 개수
131, 132
141, 2, 7, 144
151, 3, 5, 154
161, 2, 4, 8, 165
171, 172

따라서, 13 + 14 + 15 - 16 + 17 = 43을 return 해야 합니다.

입출력 예 #2

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

약수약수의 개수
251, 5, 253
261, 2, 13, 264
271, 3, 9, 274

따라서, 24 - 25 + 26 + 27 = 52를 return 해야 합니다.


😵‍💫 풀이

  1. left 와 right 사이의 값들을 반복처리 해준다.
  2. 해당 값들의 약수의 개수를 구하는 함수를 구현한다.
  3. 함수에서 약수의 개수가 짝수일 때는 true, 홀수일때는 false로 값을 리턴했다.
    3-1. left와 right가 둘다 1일 경우가 있다. 이 경우에는 false를 리턴
    3-2. 두개의 약수가 같은 경우가 있을때가 있으므로, 그럴때는 개수를 1번만 더해준다.
    (ex.9일경우 약수가 3이 두개 이므로 약수의 개수는 한개다.)
    3-3. 두개의 약수가 다른 경우에는 개수를 두번 더해준다.
  4. true 일 때는 덧셈, false일 때는 뺄셈

✍ 나의코드

class Solution {
    public int solution(int left, int right) {
        int answer = 0;
       
        for(int i = left ; i<= right ; i++)
        {
            boolean result = getNumber(i);
           
            if(result) //짝수개일때 true
            {
                answer += i;
            }
            else   //홀수일때 false
            {
                answer -= i;
            }
        }
        return answer;
    }
  
    // 약수의 갯수를 구하는 메소드
    public boolean getNumber(int num)
    {
        if(num==1)  // left , right 가 둘다 1일때 상정
        {
            return false;
        }
        int cnt = 0 ; //약수의 개수
        for(int i = 1 ; i <= num/2 ; i++)
        {   
            if(num%i==0)
            {
                if(i==num/i) // 두개의 약수가 같은 값일때,
                {
                    cnt++;
                }
                else
                {
                    cnt += 2;    
                }
            }
        }
      
        if(cnt%2 ==0)   // 개수가 짝수일 때는 true
        {
            return true;
        }
        else            // 개수가 홀수일 때는 false
        {
            return false;
        }
    }
}

👍 다른 사람의 풀이

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

🧐 배운 점

  • 수학적 원리를 적용하면 더 간편해진다.
    다른 사람의 코드를 보고 완전제곱수 개념을 제대로 알게 되었다.
    찾아보니 사실 중학교때 배웠던건데, 까먹었나보다.
    -제곱수
    제곱수일 때는 약수의 개수가 홀수,아닌 경우에는 짝수
  • Math.sqrt(n)
    n의 제곱수를 구해주는 함수
profile
Comfortable Developer

0개의 댓글