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

 

1037번: 약수

첫째 줄에 N의 진짜 약수의 개수가 주어진다. 이 개수는 50보다 작거나 같은 자연수이다. 둘째 줄에는 N의 진짜 약수가 주어진다. 1,000,000보다 작거나 같고, 2보다 크거나 같은 자연수이고, 중복되

www.acmicpc.net

 

아이디어

가장 작은 원소와 가장 큰 원소를 곱하면 N을 구할 수 있다.

 

구현 방법에 대한 고민

priority_queue와 vector

먼저 min과 max를 구해야 했다. 처음에는 vector 컨테이너에 담아서 sorting을 해서 첫 번째 원소와 마지막 원소를 읽어 오는 방법이 떠올라 코드를 작성하고 있었는데, 문득 "sorting할 필요가 없는 컨테이너를 사용하면 더 효율적이지 않을까?" 라는 생각이 들어 priority_queue를 사용하게 되었다.

그런데 제출 결과 두 방식의 메모리, 시간 차이는 없음을 알 수 있었다. ㅎㅎ

 

priority_queue 사용

#include <iostream>
#include <queue>
using namespace std;

int main()
{
	cin.tie(0);

	int div_cnt = 0;
	cin >> div_cnt;
	
	priority_queue<int, vector<int>> pq;
	priority_queue<int, vector<int>, std::greater<int>> pq_greater;

	for (int i = 0; i < div_cnt; i++) {
		int key;
		cin >> key;
		pq.push(key);
		pq_greater.push(key);
	}
	int min = pq.top();
	int max = pq_greater.top();

	int result = min * max;
	cout << result << "\n";
}

 

vector 사용

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

int main()
{
	cin.tie(0);

	int div_cnt = 0;
	cin >> div_cnt;
	
	vector<int> v(div_cnt);

	for (int i = 0; i < div_cnt; i++) {
		cin >> v[i];
	}
	sort(v.begin(), v.end());

	int min = v[0];
	int max = v[div_cnt - 1];

	int result = min * max;
	cout << result << "\n";
}

'알고리즘 > BOJ' 카테고리의 다른 글

백준 14889: 스타트와 링크 - X  (0) 2022.05.30
백준 1978: 소수 찾기  (0) 2022.05.26
백준 9095: 1, 2, 3 더하기  (0) 2022.02.09
백준 1182: 부분 수열의 합  (0) 2022.02.08
백준 6603 : 로또  (0) 2021.06.23

+ Recent posts