코딩기록 저장소 🐕/코테

프로그래머스 Java 순서쌍의 개수😂

kimkongmom 2024. 2. 23. 13:59

 

 

 

문제 설명
순서쌍이란 두 개의 숫자를 순서를 정하여 짝지어 나타낸 쌍으로 (a, b)로 표기합니다. 자연수 n이 매개변수로 주어질 때 두 숫자의 곱이 n인 자연수 순서쌍의 개수를 return하도록 solution 함수를 완성해주세요.

제한사항
1 ≤ n ≤ 1,000,000

 

 

 

입출력 예 설명


입출력 예 #1
n이 20 이므로 곱이 20인 순서쌍은 (1, 20), (2, 10), (4, 5), (5, 4), (10, 2), (20, 1) 이므로 6을 return합니다.


입출력 예 #2
n이 100 이므로 곱이 100인 순서쌍은 (1, 100), (2, 50), (4, 25), (5, 20), (10, 10), (20, 5), (25, 4), (50, 2), (100, 1) 이므로 9를 return합니다.

 

 

풀이

어려웠던 문제입니다. 우선  n의 약수를 찾아서 약수 쌍의 개수를 계산하는 함수입니다.

for문을 사용해서 했습니다. Math.sqrt()를 사용해 중복되는 약수를 방지하고 효율적으로 약수를 찾을 수 있습니다.

 

 

예시

n = 20

for문 진입: for (int i = 1; i <= Math.sqrt(n); i++)에서 i를 1부터 4까지 증가시키면서 반복합니다. (Math.sqrt(20)은 약 4.47이므로, i가 5 이상이 되면 루프를 종료합니다.)

첫 번째 반복: i = 1
if (n % i == 0)에서 20 % 1은 0이므로 조건이 참입니다.
int j = n / i;에서 j는 20이 됩니다.
if (i == j)에서 1 == 20은 거짓이므로 else 블록으로 이동.
answer += 2;에서 answer가 2로 증가.


두 번째 반복: i = 2
if (n % i == 0)에서 20 % 2는 0이므로 조건이 참입니다.
int j = n / i;에서 j는 10이 됩니다.
if (i == j)에서 2 == 10은 거짓이므로 else 블록으로 이동.
answer += 2;에서 answer가 4로 증가.


세 번째 반복: i = 3
if (n % i == 0)에서 20 % 3은 2이므로 조건이 거짓입니다. (나누어 떨어지지 않음)


네 번째 반복: i = 4
if (n % i == 0)에서 20 % 4은 0이므로 조건이 참입니다.
int j = n / i;에서 j는 5가 됩니다.
if (i == j)에서 4 == 5는 거짓이므로 else 블록으로 이동.
answer += 2;에서 answer가 6으로 증가.

 

class Solution {
    public int solution(int n) {
        int answer = 0;
        for (int i = 1; i <= Math.sqrt(n); i++) {
            if (n % i == 0) {
                int j = n / i;          
                if (i == j) {
                    answer++;
                } else {
                    
                    answer += 2;
                }
            }
        }
        return answer;
    }
}