Adventure Time - Jake [백준/python] 11653 소인수분해: 소인수분해가 끝날 조건을 생각해보자
본문 바로가기
Back-end/백준(python)

[백준/python] 11653 소인수분해: 소인수분해가 끝날 조건을 생각해보자

by bogyoi 2023. 10. 25.
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

참고로 이건 다른 사람이 작성한 코드이다.