반응형

문제

https://www.acmicpc.net/problem/2501

 

2501번: 약수 구하기

첫째 줄에 N과 K가 빈칸을 사이에 두고 주어진다. N은 1 이상 10,000 이하이다. K는 1 이상 N 이하이다.

www.acmicpc.net

어떤 수의 약수 중 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)

가릿? 

 

반응형

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 15894번 풀이  (0) 2023.06.25
백준 9506번 풀이  (0) 2023.06.24
백준 5086번 풀이  (0) 2023.06.22
백준 2903번 풀이  (0) 2023.06.21
백준 2720번 풀이  (0) 2023.06.19

Profile

Lv. 36 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ