알고리즘

백준 - 11653번

joy_lee 2021. 8. 5. 21:13

소인수분해

https://www.acmicpc.net/problem/11653

 

11653번: 소인수분해

첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.

www.acmicpc.net

시간초과한 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
= int(input())
numbers = [i for i in range(2int(N/2)+1)]
= 2
prime = []
while i*<= numbers[-1]:
    if i in numbers:
        prime.append(i)
        numbers.remove(i)
    for num in numbers:
        if num % i == 0:
            numbers.remove(num)
    i += 1
prime.extend(numbers)
result = []
for num in prime:
    while N % num == 0:
        result.append(num)
        N = N // num
if result:
    for num in result:
        print(num)
else:
    print(N)
cs

나누는 횟수를 줄이려고 N까지의 소수를 먼저 구한 뒤, 그 소수들로 나누는 작업을 했다. 그런데 이렇게 하니까 오히려 사용하지 않을 소수를 찾기 위해 많은 계산을 한 것 같다.

 

통과한 코드

1
2
3
4
5
6
7
8
9
import math
= int(input())
for i in range(1int(math.sqrt(N))):
    i += 1
    while N % i == 0:
        N /= i
        print(i)
if N != 1:
    print(int(N))
cs

오히려 더 간단하게 N의 제곱근까지 나눠주고, 나눠지지 않는 수가 있다면 마지막에 화면에 출력해주는 것이 더 빨랐다.

 

'알고리즘' 카테고리의 다른 글

백준 - 9020번  (0) 2021.08.06
백준 - 4948번 / 에라토스테네스의 체  (0) 2021.08.06
백준 - 2581번, 1929번 / 소수  (0) 2021.08.05
백준 - 1978번 / 소수  (0) 2021.08.04
백준 - 1011번  (0) 2021.08.03