개발 공부

프로그래머스 약수의 개수와 덧셈 Java (+2) 본문

코딩 테스트

프로그래머스 약수의 개수와 덧셈 Java (+2)

hyecozy 2022. 12. 1. 20:55

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        //left부터 right까지 약수의 개수 구하기, 개수에 따라 연산하기 반복
        for(int i = left; i <= right; i++){
            int cnt = 0;
            //i의 약수 구하기
            for(int j = 1; j <= (i / 2); j++){
                if(i % j == 0){
                    cnt++;
                }
            }
            //i 자신도 포함해야 돼서 cnt에 1을 더함
            cnt++;
            if(cnt % 2 == 0){
                answer += i;
            }
            else{
                answer -= i;
            }
        }
        return answer;
    }
}

넘 길다... 다른 사람 풀이 보면 분명 더 깔끔하고 수학적으로 푼 사람이 있을 것 같다

또 결국 이중for문 썼다...ㅠ 여기에 스트림을 써서 간단하게 푼 사람도 있을까?

그래도 전에 푼 약수 관련 문제 풀이를 떠올려서 for문의 범위를 최대한 줄일 수 있도록 했다.

예를 들어 14의 약수의 개수를 구한다고 치면

1, 2, 7, 14... 14 본인은 꼭 자기 약수에 포함되게 된다

그래서 for문을 14까지 돌리지 않고 14를 반으로 쪼갠 7까지만 돌린 후 cnt에 1만 더했다

 

 

아래는 추천 수가 많았던 다른 사람의 풀이 중 일부ㅠ

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

.... Math 함수 중에 제곱수 구하는 게 있었구나

생각해 보니 제곱수 구하는 메소드가 있는 것이 좀 당연해서 왜 여기까지 찾아볼 생각을 못했는가 하는 중

 

 

Comments