rueki

BOJ 2501.약수 구하기 본문

C, C++ 문제풀이

BOJ 2501.약수 구하기

륵기 2020. 12. 22. 10:24
728x90
반응형

www.acmicpc.net/problem/2501

 

2501번: 약수 구하기

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

www.acmicpc.net

첫 번째 풀이

 

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;


int main(void)
{
	int N,K;
	vector<int> v;
	cin >> N >> K;
	for(int i = 1;i<=N;i++)
	{
		if(N%i==0)
		{
			v.push_back(i);
			
		}
	}
	sort(v.begin(), v.end());
	cout<<v[K-1];
	
	return 0;
}

구하고자 하는 수를 1~N 숫자 하나씩 다 나눠서 나머지가 0인것을 구하는 방법이다.

6을 1~6의 모든 숫자로 나눠서 0이 나오는 숫자는 1, 2, 3, 6이 나오게 된다.

 

두 번째 풀이

 

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;


int main(void)
{
	int N,K;
	vector<int> v;
	cin >> N >> K;
	for(int i = 1;i*i<=N;i++)
	{
		if(N%i==0)
		{
			v.push_back(i);
			v.push_back(N/i);
		}
	}
	sort(v.begin(), v.end());
	v.erase(unique(v.begin(),v.end()), v.end());
	cout<<v[K-1];
	
	return 0;
}

1~6까지 숫자에서 for문 종료 조건을 i 제곱으로 바꾸었는데, 이는 나누는 수의 제곱이 N보다 작을 때까지만 검사하면 되기에 더 큰 수의 약수를 구할 때 횟수가 첫 번째 풀이보다 작은 것을 알 수가 있다.

unique는 중복 숫자를 걸러내기 위함이며, 중복 숫자는 맨 뒤로 남겨지게 된다. 남겨진 값을 erase를 통해서 지우게 해주었다.

728x90
반응형

'C, C++ 문제풀이' 카테고리의 다른 글

BOJ 1427. 소트인사이드  (0) 2020.12.24
BOJ 2908. 상수  (0) 2020.12.24
BOJ 5635. 생일  (0) 2020.12.22
BOJ 14719 . 빗물  (0) 2020.10.26
BOJ 11005. 진법 변환 2  (0) 2020.10.26
Comments