[백준/파이썬] 2501. 약수 구하기

jwKim·2023년 1월 4일
0

💻코테코테

목록 보기
1/42

< 과제 >

[ 문제 ]
어떤 자연수 p와 q가 있을 때, 만일 p를 q로 나누었을 때 나머지가 0이면 q는 p의 약수이다.

6을 예로 들면

6 ÷ 1 = 6 … 0
6 ÷ 2 = 3 … 0
6 ÷ 3 = 2 … 0
6 ÷ 4 = 1 … 2
6 ÷ 5 = 1 … 1
6 ÷ 6 = 1 … 0
그래서 6의 약수는 1, 2, 3, 6, 총 네 개이다.

두 개의 자연수 N과 K가 주어졌을 때, N의 약수들 중 K번째로 작은 수를 출력하는 프로그램을 작성하시오.

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

[ 출력 ]
첫째 줄에 N의 약수들 중 K번째로 작은 수를 출력한다. 만일 N의 약수의 개수가 K개보다 적어서 K번째 약수가 존재하지 않을 경우에는 0을 출력하시오.

[ 예제 입력 1 ]
6 3
[예제 출력 1 ]
3

[ 예제 입력 2 ]
25 4
[예제 출력 2 ]
0

[ 예제 입력 3 ]
2735 1
[예제 출력 3 ]
1

< 내 코드>

str = input()

N = int(str.split(' ')[0])
K = int(str.split(' ')[1])

lst = [] # 약수를 담을 리스트
for i in range(1, N+1): # 약수는 모두 자연수이므로 범위는 1 ~ N+1
    if N % i == 0:  # 나누어 떨어지는지 확인
        lst.append(i) # 나누어 떨어지면 리스트에 추가

try:
    print(lst[K-1])
except: # 약수의 개수가 K보다 적으면 IndexError 발생
    print(0)

< 피드백 >

  • N,K를 나눌 때 str.split()이라는 코드를 두번 반복하므로 비효율이 발생하는 것 같다. 이 부분을 N, K = map(int, input().split())으로 바꿔야 할 것 같다.(참고한 블로그)
  • 전체적으로 코드를 간결하게 사용할 수 있는 방법을 찾아야 할 것 같다. 정보를 찾아보니 for문이나 if문도 한 줄로 사용이 가능한 것 같다.(물론 이런 문제에서도 사용할 수 있을지 모르겠지만..)

[ input().split() 사용법 ]

변수1, 변수2 = input().split()
→ 문자 사이를 나누는 default 값은 공백임 / split할 문자 지정 가능

input()의 결과의 데이터 타입은 문자열임. 따라서 이번 문제와 같이 정수형으로 형변환을 할 필요가 있는데, 여러 개의 변수를 동시에 형변환하는 방법은 map()함수를 사용하는 방법임

[ map() 사용법 ]
변수 = map(변환할 타입, 변환할 문자)
→ 이를 적용하면 아래와 같다.
→ 변수1, 변수2= map(int, input().split())

< 출처 >
https://www.acmicpc.net/problem/2501

0개의 댓글