본문 바로가기

코딩테스트 준비 with Python/내가 보려고 정리하는 문풀

K번째 약수

두개의 자연수 N과 K가 주어졌을 때, 

N의 약수들 중 K번째로 작은 수를 출력하는 프로그램 작성

*약수 개수가 K보다 작아서 K번째 약수가 존재하지 않을 경우 -1 출력

 

입력예시) 

6 3

출력예시)

3


내가 쓴 코드

n, k = map(int,input().split())

#약수 넣을 리스트
lst = []

#리스트에 약수들 넣음
for i in range(1,n+1):
    if n%i == 0:
        lst.append(i)

#리스트 오름차순 정렬
lst.sort()

if len(lst) < k:
    print(-1)

else:
    print(lst[k-1])

 

모범답안

n, k = map(int, input().split())
cnt = 0

for i in range(1,n+1):
    n%i == 0:
        cnt+=1
    if cnt == k:
        print(i)
        break
else:
    print(-1)

 

모범답안보고 반성하기

  • 굳이 약수들을 넣을 list를 만들지 않고도, cnt 변수 생성을 통해 해결할 수 있었음
  • for else 구문을 이용할 생각을 하지 못함 . 난 참 생각을 협소하게 하는것같다 근데 경험이 부족해서 그런거겠지?
  • for else 구문은 .. for문이 정상종료 될 경우 else문이 실행되고, for문이 정상종료가 아닌 break로 강제종료 되는 경우에는 else문이  실행되지않는 특징을 가지고 있다.
  • 그니까 여기서는 cnt가 k를 도달해서 약수의 개수가 k보다 크거나 같은 경우에는 break로 종료가 되기때문에 else문이 실행되지않고
  • cnt가 k를 도달하지 못해서 for문이 자연스럽게 종료되는 경우에는(정상종료) else문이 실행되는 것

반성하고 다시 풀어보기

N, K = map(int, input().split())
cnt = 0

for i in range(1,N+1):
    if N%i == 0:
        cnt+=1
    if cnt == K:
        print(i)
        break
else:
    print(-1)

 

'코딩테스트 준비 with Python > 내가 보려고 정리하는 문풀' 카테고리의 다른 글

자릿수의 합  (2) 2024.06.08
정다면체  (0) 2024.06.07
대표값  (0) 2024.06.06
K번째 큰 수  (0) 2024.06.06
K번째 수  (0) 2024.06.06