본문 바로가기

알고리즘 Algorithm/BOJ 백준 (초급~중급)

[BOJ 백준] 소수의 곱(2014) C++

 

링크 : https://www.acmicpc.net/problem/2014

 

2014번: 소수의 곱

첫째 줄에 K(1 ≤ K ≤ 100), N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 K개의 소수가 오름차순으로 주어진다. 같은 소수가 여러 번 주어지는 경우는 없으며, 주어지는 소수는 모두 541보다 작거나

www.acmicpc.net

 

문제 설명 : 

더보기

K개의 소수가 있다. 이때, 이 소수들 중에서 몇 개를 곱해서 얻게 되는 수들이 있을 것이다. 소수들을 선택할 때에는 같은 수를 선택해도 되며, 주어지는 소수 자체도 포함시키자.

예를 들어 세 소수가 2, 5, 7이었다면, 이러한 곱들을 오름차순으로 나타내 보면, 2, 4, 5, 7, 8, 10, 14, 16, 20, 25, 28, 32, 35, 등이 된다.

K개의 소수가 주어졌을 때, 이러한 소수의 곱들 중에서 N번째 수를 구해 보자. 단 정답은 231보다 작은 자연수이다.

 

입력 : 

더보기

첫째 줄에 K(1 ≤ K ≤ 100), N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 K개의 소수가 오름차순으로 주어진다. 같은 소수가 여러 번 주어지는 경우는 없으며, 주어지는 소수는 모두 541보다 작거나 같은 자연수이다.

출력 : 

더보기

첫째 줄에 문제에서 설명한 대로 소수의 곱을 나열했을 때, N번째 오는 것을 출력한다.

 

 

예제 입력 : 

더보기

4 19
2 3 5 7

예제 출력 : 

 

 

접근법 : 

1) 어떻게 풀 것인가?

 

 

2) 시간복잡도

 

 

3) 공간복잡도

 

 

4) 풀면서 놓쳤던점

 

 

5) 이 문제를 통해 얻어갈 것

 

 

 

C++ 코드 : 

// 소수의 곱 2014 C++
#if 1
#pragma warning(disable:4996)
#include <cstdio>
#include <queue>

using namespace std;

int K, N; // K개의 소수 (~100)   /   N < 10만 
int ans;

long long prime[100 + 3];


struct num {
	long long val;
	num(long long val) {
		this->val = val;
	}
	// 최소힙 구현을 위한 연산자 오버로딩
	bool operator<(const num& o) const {
		return val > o.val;
	}
};

priority_queue<num> pq;

int main() {

	//freopen("input.txt", "r", stdin);

	scanf("%d %d", &K, &N);
	for (int i = 0; i < K; i++) {
		scanf("%lld", &prime[i]);
		pq.push(prime[i]);
	}

	int cnt = 0;
	long long result;

	while (cnt != N) {
		for (int i = 0; i < K; i++) {
			ans = pq.top().val;
			result = prime[i] * pq.top().val;

			// 2147483647
			if (result >= ((1 << 30) - 1) + (1 << 30)) {
				break;
			}
			
			pq.push(result);

			if (ans % prime[i] == 0) {
				break;
			}
			
		}
		pq.pop();
		cnt++;
	}

	printf("%d", ans);

	return 0;
}
#endif
반응형