n= int(input())
r1=n
r2=1
i=2
while(1):
if n%i==0:
n=n//i
print(i)
r2*=i
else:
i+=1
if r1==r2:
break
성공!
2로 계속 나눠 본다 -> 2로 안 나눠떨어지면 1을 더해서 3으로 나눠본다 -> 3으로 안 나눠떨어지면 1을 더해서 4로 나눠본다 -> ...
이때 나눈 값들은 r2라는 변수에 곱해서 저장해준다.
이 r2가 처음에 입력한 수(n=r1)와 같게되면 while문을 break해준다.
이 방법은 for i in range(2, n): 과 같은 조건식을 사용하지 않고, while문을 사용한 후 r1==r2이면 바로 종료하게해서 필요한 만큼만 계산 작업을 하기 때문에 좋은 것 같다.
n= int(input())
i=2
while(n!=1):
if n%i==0:
n=n//i
print(i)
else:
i+=1
조금 더 간결해진 코드이다. 불필요한 변수 선언, 곱셈이 없고
while(1)에 break를 걸 조건을 추가로 거는 것보다, while(조건)을 하는 게 깔끔하다.
처음엔 소인수분해한 값들을 다 곱하면 원래의 값이니까, 그걸 생각해서 첫번째 코드와 같이 작성을 했었다. 그러나 n을 i로 쭉 나눠서 소인수분해가 다 되면, n=1이 된다는 것을 생각해보면, 위와 같은 코드를 작성할 수 있다.
나는 이 코드가 마음에 든다.
n = int(input())
if n == 1:
print('')
# 2부터 하나씩 나눠보기
for i in range(2, n+1):
if n % i == 0:
#해당 숫자로 나눌 수 없을 때까지 나누기
while n % i == 0:
print(i)
n = n / i
참고로 이건 다른 사람이 작성한 코드이다.
'Back-end > 백준(python)' 카테고리의 다른 글
[백준/python] 2903 중앙 이동 알고리즘: 수학적인 사고를 해보장.. (0) | 2023.10.25 |
---|---|
[백준/python] 2720 세탁소 사장 동혁: 거스름돈 계산 -> 그리디 알고리즘이 왜 가능할까? (0) | 2023.10.25 |
[백준/python] 2580 소수: 1트 코드 왜 틀렸었던걸까 (0) | 2023.10.25 |
[백준/python] 1978 소수찾기: (0) | 2023.10.25 |
[백준/python] 9506 약수들의 합: print()의 sep옵션, 언패킹(unpacking, *) / join기능 (1) | 2023.10.25 |