본문 바로가기
코딩테스트 연습/프로그래머스 Lv.0

프로그래머스 코딩테스트 lv.0 - 순서쌍의 개수. (Java)

by 트레비봄 2023. 7. 27.
728x90

문제 설명
입출력 예

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        for (int i = 1; i <= n; i++) {  
//      i가 1부터 n까지 반복.            
            if (n % i == 0) {     
//      n이 i로 나눈 나머지 값이 0 이면 순서쌍이기에 적합하면 순서쌍의 개수(answer) 증가.
                answer++;
            }
        }
        return answer;
    }
}

* 순서쌍의 개수 라는 문제.

* 막상 순서쌍의 개념은 문제에서 설명하니 기초 지식은 없어도 풀 수 있는 문제

* 쉬운 편인 것 같다.

* GPT 한테 코드 리뷰를 맡겼더니 다른 코드가 2종류가 나옴.

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        for (int i = 1; i <= Math.sqrt(n); i++) {        
            if (n % i == 0) {     
                // i가 n의 약수인 경우
                answer++;

                // i가 n의 약수이면서 제곱근이 아닌 경우, n을 i로 나눈 몫도 약수이므로 answer를 추가로 증가시킴
                if (i != Math.sqrt(n)) {
                    answer++;
                }
            }
        }
        return answer;
    }
}

 * 이건 내가 작성한 코드를 개선한 코드.

* Math.sqrt 를 사용해서 풀었다.

* 개선 가능한 부분은 아래와 같다.

* 주어진 숫자 n의 제곱근까지만 반복을 하면 된다. 왜냐면 n의 제곱근보다 큰 약수는 n을 나누어 떨어뜨릴 수 없기 때문.

* 내가 작성한 코드의 시간 복잡도는 O(n), 개선한 코드의 시간 복잡도는 O(sqrt(n)).

 

* 그래서 혹시나해서 문제에 대한 설명을 첨부한 후 다시 코드 리뷰를 부탁했다.

class Solution {
    public int solution(int n) {
        int count = 0;
        
        for (int i = 1; i <= Math.sqrt(n); i++) {        
            if (n % i == 0) {     
                // i가 n의 약수인 경우
                int a = i;
                int b = n / i;
                
                if (a * b == n) {
                    count++;
                }

                // a와 b가 같지 않은 경우, 다른 순서쌍이므로 추가로 count를 증가시킴
                if (a != b) {
                    count++;
                }
            }
        }
        return count;
    }
}

* 역시 Math.sqrt 를 사용했고, 개선 방향을 숫자 n을 두 개의 숫자로 곱한 결과가 n이 되는

* 모든 순서쌍의 개수를 찾아야 한다고 했다.

* 시간 복잡도는 역시 O(sqrt(n)).

* 이런걸 보면 자바 문법에 대한 기본지식이 꽤 있어야 겠다는 생각이 든다.

* 다음에도 이렇게 코드 리뷰를 해봐야 겠다. ㅎㅎ

 

230727 학습.    

728x90