본문 바로가기
프로그래밍/알고리즘

백준 2501번: 약수 구하기

by 만디기 2024. 3. 20.

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

 

2501번: 약수 구하기

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

www.acmicpc.net

 

(1) 내 해답 - 1 : 카운트를 세어 가며 해결함

#include <cstdio>

int main()
{
    int p = 0, q = 0;
    int index = 1, result = 0;
    
    scanf("%d %d", &p, &q);

    for ( int i = 1 ; i <= p ; i++ )
    {
        if ( index > q ) break;
        if ( p % i == 0 ) 
        {
            result = i;
            index++;
        }
    }

    printf("%d", ( index > q ) ? result : 0 );
    return 0;
}

 

(2) 내 해답 - 2 : 배열을 선언하여 약수를 구할 때마다 배열에 넣은 후, 해당 값을 출력함 

#include <cstdio>

int main()
{
    int arr[10000] = {0, };
    int p = 0, q = 0;
    int index = 1;
    
    scanf("%d %d", &p, &q);

    for ( int i = 1 ; i <= p ; i++ )
    {
        if ( index > q ) break;
        if ( p % i == 0 ) 
        {
            arr[index - 1] = i;
            index++;
        }
    }

    printf("%d", arr[q - 1] );
    return 0;
}

 

(3) 다른 해답

a,b=map(int,input().split())
print(([f'{i}'for i in range(1,a+1)if a%i==0]+[0]*10000)[b-1])

a,b=map(int,input().split())
c=0
while b and c<a:
    c+=1
    if a%c==0:
        b-=1
print(0 if b else c)

#include<stdio.h>
int main()
{
	int i,n,k,cnt=0;
	scanf("%d%d",&n,&k);
	for(i=1;i<=n&&(k-cnt);++i) //k번째 약수를 구할 때까지 for문 동작
		if(n%i==0) cnt++;
	printf("%d",(cnt==k)?i-1:0);
}

#include<cstdio>
int i,n,k;
int main() {
	scanf("%d %d", &n, &k);
	for (i = 1; i <= n&&k; i++) k -= !(n%i); // 나머지 값이 0인 경우에만 k 값 감소
	printf("%d", k ? 0 : i - 1);
	return 0;
}