Python/online judge

백준 [11653.소인수분해] | Python

구름솜:D 2024. 1. 10. 18:22
728x90

✏️ 문제

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

 

11653번: 소인수분해

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

www.acmicpc.net

 

✏️ 풀이방법

1. 정수n을 소수 중 가장 작은 수 2로 나누는 반복을 수행하는데 2로 나눠떨어지지 않을 때 다음 숫자로 +1을 해서 나눈다.

 

📌 코드

n = int(input())
i = 2
while True:
    if n == 1:
        print("")
        break
    if n % i == 0:
        n = n//i
        print(i)
    else:
        i +=1

 

 

📌 결과

# 입력
72

#출력
2
2
2
3
3
# 입력
3

#출력
3
# 입력
6

#출력
2
3
# 입력
9991

#출력
97
103

 

 

🤔 시행착오.1

n = int(input())
if n == 1:
    print("")
while True:
    divisor = []
    for i in range(1,n+1):
        if n % i == 0:
            if i != 1:
                divisor.append(i)
    n = n // min(divisor)
    print(min(divisor))
    if n == 1:
        break

- 정상출력되지만 런타임에러가 발생한다. for문으로 n의 약수를 모두 구해서 가장 작은수를 리스트(divisor)에 담고, n을 가장 작은 수로 나눈 수의 약수를 또 다시 모두 구해서 가장 작은 수를 리스트(divisor)에 담아서  n이 나눠떨어지지 않을 때까지 반복을 수행하며 풀어서 불필요한 연산이 너무 많이 수행된다.

 

🤔 시행착오.2

n = int(input())
def soinsu(n):
    divisor = []
    for i in range(1,n+1):
        if n % i == 0:
            if i != 1:
                divisor.append(i)
    result = min(divisor)
    return result

while True:
    if n != 1:
        print(soinsu(n))
        n = n//soinsu(n)

-  정상출력은 되지만 시간초과 에러가 난다. 런타임에러를 해결하고자 함수를 사용한거지만 풀이가 시행착오1과 같기 때문에 너무 많은 연산이 수행된다.

 

 

📝 메모

- 시간초과랑 런타임에러 차이