Post

[Programmers] #120852 - 소인수분해 [Java][C++][Python]

자연수 n을 소인수들의 곱으로 나타냈을 때 등장하는 소인수를 오름차순으로 나열한 배열을 구하는 문제.

[Programmers] #120852 - 소인수분해 [Java][C++][Python]

문제 링크


1. 아이디어

x를 2부터 1씩 늘려가며 nx로 나누어떨어지는지 확인한다. 나누어떨어지면 xn의 소인수이므로 결과에 담고, 더 이상 나누어떨어지지 않을 때까지 nx로 계속 나눠 같은 소인수의 중복을 없앤다. x를 작은 값부터 훑기 때문에 x가 합성수가 될 즈음에는 그 약수인 더 작은 소수들로 n이 이미 모두 나뉘어 nx로 나누어떨어지지 않으므로, 별도의 소수 판정 없이도 소인수만 오름차순으로 모인다. n이 1이 되면 모든 소인수를 찾은 것이다.


2. 복잡도

접근시간공간
풀이$O(N)$$O(\log N)$

($N$ = 입력값 n. n이 소수이면 xn까지 증가한다. 결과 배열의 크기는 서로 다른 소인수의 개수로 $O(\log N)$이다)


3. 코드

풀이 [Java][C++][Python]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.*;

class Solution {
    public int[] solution(int n) {
        List<Integer> list = new ArrayList<>();
        int x = 2;

        while (n > 1) {
            if (n % x == 0) {
                list.add(x);
                while (n % x == 0) {
                    n /= x;
                }
                continue;
            }

            x++;
        }

        return list.stream().mapToInt(Integer::intValue).toArray();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <bits/stdc++.h>
using namespace std;

vector<int> solution(int n) {
    vector<int> v;
    int x = 2;

    while (n > 1) {
        if (n % x == 0) {
            v.push_back(x);
            while (n % x == 0) {
                n /= x;
            }
            continue;
        }

        x++;
    }

    return v;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def solution(n):
    lst = []
    x = 2

    while n > 1:
        if n % x == 0:
            lst.append(x)
            while n % x == 0:
                n //= x
            continue

        x += 1

    return lst

This post is licensed under CC BY 4.0 by the author.