백준 2501번 풀이

문제

어떤 수의 약수 중 k번째로 작은 수 구하기

풀이

약수랑 배수는 앞 문제에서 뭔지 설명했으니 패스. 이 문제에서는 어떤 수의 약수를 찾고+그 약수 중 k번째 약수를 출력하면 되는 매우 간단한 문제이다. 간단하다면서 정답률이 49%인 이유는 이따 설명해드림.

import sys

N, K = map(int, sys.stdin.readline().split())
yaksu_list = []

일단 입력은 입력이고 약수를 담을 배열이 필요하다.

for i in range(1, N+1):
    if N % i == 0:
        yaksu_list.append(i)

그리고 로직도 이거면 된다. 약수는 나머지가 0이니까 나눠서 나머지가 0이면 리스트에 넣고

print(yaksu_list[K-1])

아! 인덱싱 번호때문에 정답률이 낮았구나! 끝! 이거 내야지!!

네 그런 당신을 틀렸습니다가 반길것입니다 휴먼.

인덱싱 번호도 번호인데 이 문제에는 매우 기가 막힌 함정이 숨어있다. 25의 약수 중 4번째로 큰 약수를 달라고 하면 어떻게 될 지 생각해본 적 있음?

컴퓨터가 미쳤습니까 휴먼? 함. 그리고 백준 문제에도 ‘만일 N의 약수의 개수가 K개보다 적어서 K번째 약수가 존재하지 않을 경우에는 0을 출력하시오.’라고 쓰여있다. 왜죠? 25는 약수가 1, 5, 25로 세개그등요. 아 망했네 이거 어떡하죠? 약수 배열이 있으니까 배열 길이보다 K가 길때 0을 출력하게 만들면 되나요?

try:
    print(yaksu_list[K-1])
except:
    print(0)

뭘 고민함 걍 예외처리 때리지. 어차피 이거 배열 길이보다 인덱싱 하는 게 길어서 IndexError 난거잖음? 그니까 1) k번째 약수를 출력하되 2) IndexError가 나면 0을 출력해라 라고 하는거다. 엑셀의 Iferror랑 비슷하다.

import sys

N, K = map(int, sys.stdin.readline().split())
yaksu_list = []

for i in range(1, N+1):
    if N % i == 0:
        yaksu_list.append(i)

try:
    print(yaksu_list[K-1])
except:
    print(0)

가릿?