문제이해
소인수분해라면 어떠한 수가 주어졌을 때 소수로 나눌 수 없을 때 까지 나눈 값들을 소인수분해라고 하지 않나?
예시이다.
1. 그러면 우리는 일단 소수를 구하고
2. 소수의 가장 작은 것 부터
3. 적어준 값에 나눠봐서
4. 몪이 정수형태로 나오지 않을 때까지
5. 나누면 되지 않을까?
num = int(input())
sosu_nums = []
for i in range(1,num+1):
count = 0
if(i > 1):
for j in range(2, i):
#소수가 아님
if(i % j == 0):
count +=1
if(count == 0):
sosu_nums.append(i)
print(sosu_nums)
1번을 수행한 것이다.
값을 넣으면 sosu_nums에 소수가 쌓인다.
2부터 쌓인다.
그렇다면 소수 가장 작은 것은 sosu_nums 첫번째에 있을 것입니다.
만약 주어진 수의 나머지가 0이 아니라면 그건 소인수 분해가 끝이 났거나, 다른 소수로 나눠봐야 합니다.
값을 나눴어 -> 몫이 정수가 나오거나 (나머지가 0)
-> 몫이 소수점으로 나오거나 (나머지가 0이 아님)
코드를 봐보면
num = int(input())
sosu_nums = []
for i in range(1,num+1):
count = 0
if(i > 1):
for j in range(2, i):
#소수가 아님
if(i % j == 0):
count +=1
if(count == 0):
sosu_nums.append(i)
print(sosu_nums)
t = 0
# num이 나눠진다면 다시 num을 처음부터 시작한다.
while((t) < len(sosu_nums)):
#나머지
na = num % sosu_nums[t]
if(na != 0):
t += 1
continue
#print("num: " ,num)
print(sosu_nums[t])
#몫
num = int(num) / sosu_nums[t]
이렇게 쓰니 시간 초과가 납니다.
더 좋은 방법이 있는거 보다 더 좋은 방법이 있는거 같습니다.
주어진 수의 소수를 찾고
그 수에다가 모든 소수를 나누려니 => 시간 초과가 떳습니다.
에라토스테네스의 체의 원리로 소수를 찾아봐도 시간초과가 => 떴습니다.
다른 방법을 찾아보다가
주어진 수를 2부터 나누면서 while문을 돌려보면 어떨까 생각했습니다.
어처피 2에서 못나누면 => 4에서도 못나누고 => 6에서도 못나누고...
3에서 못나누면 => 6에서도 못나누고 => 9에서도 못나누고 ...
즉. 주어진 수를 2부터 나눠봐서 주어진 수를 줄여나가는게 답인거 같습니다.
num = int(input())
t = 2
while(num >= 0):
if(num == 1):
break
#들어온 값이 2부터 나눠진다면
if((num) % t == 0):
print(t)
num = num // t
t = 2
continue
t += 1
728x90
'알고리즘 > 백준알고리즘' 카테고리의 다른 글
[백준 알고리즘/Python3] 4948 베르트랑 공준 (0) | 2021.12.02 |
---|---|
[백준 알고리즘/Python3] 1929 에라토스테네스의 체 (0) | 2021.10.31 |
[백준 알고리즘/Python3] 2581 소수 (0) | 2021.10.03 |
[백준 알고리즘/Python3] 2839 설탕배달 (0) | 2021.09.27 |
[백준 알고리즘/Python3] 2775 부녀회장이 될테야 (0) | 2021.09.07 |