책 읽다가 코딩하다 죽을래

백준 11502 세 개의 소수 문제 해답 본문

코딩/알고리즘문제

백준 11502 세 개의 소수 문제 해답

ABlue 2020. 3. 19. 11:09

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

 

11502번: 세 개의 소수 문제

문제 정수론(수학)에서, 세 개의 소수 문제(3-primes problem) 는 다음과 같은 추측을 말한다. '5보다 큰 임의의 홀수는 정확히 세 개의 소수들의 합으로 나타낼 수 있다. 물론 하나의 소수를 여러 번 더할 수도 있다.' 예를 들면, 7 = 2 + 2 + 3 11 = 2 + 2 + 7 25 = 7 + 7 + 11 5보다 큰 임의의 홀수를 입력받아서, 그 홀수가 어떻게 세 소수의 합으로 표현될 수 있는지 (또는 불가능한지) 알아보는 프로그램을

www.acmicpc.net

소수찾기의 알고리즘은 기본적으로 에라토스테네스의 체를 많이 이용한다

에라토스테네스의 체를 처음 들어보셨으면 아래의 글에 들어가 ppt를 읽고오면 도움이 될 것이다

2020/02/28 - [알고리즘] - [소수 찾기]에라토스테네스의 체

 

[소수 찾기]에라토스테네스의 체

소수를 찾는 알고리즘 중 가장 많이 사용되고 있는 것은 에라토스테네스의 체입니다. 제가 직접 만든 ppt파일입니다. 2차 배포는 금지하며 개인 소장이나 교육 목적을 위한 용도에 사용해주셨으면 합니다 코드는..

ablue-1.tistory.com

#include <iostream>		//11502 세 개의 소수 문제
#include <vector>
using namespace std;
vector<int> v;
#define MAX 1001
int c[MAX] = { 0, };
int vector_size;
void init();
void primeNumberSieve();
void fineSolution();
int main()
{
	init();
	primeNumberSieve();
	fineSolution();
	return 0;
}
void init()
{
	for (int i = 0; i < MAX; i++)
	{
		c[i] = i;						//배열의 원소값을 각 index로 초기화
	}
}
void primeNumberSieve()
{
	for (int i = 2; i < MAX; i++)		//2부터 시작해서 특정한 숫자의 배수들은 소수가 아니다
	{
		if (c[i] == NULL) continue;		//이미 소수가 아닌 걸로 판정된 숫자들은 그냥 지나가고
		for (int j = i + i; j < MAX; j += i) {		//판정되지 않았다면 그의 배수들을 소수가 아닌 숫자로 판정한다
			c[j] = NULL;
		}
	}
	for (int i = 2; i < MAX; i++) {					//판정되지 않은 숫자들(소수들)을 모두 출력한다
		if (c[i] != NULL) v.push_back(i);
	}
	vector_size = v.size();
}
void fineSolution()
{
	int input, Case;
	bool isResult = false;
	cin >> Case;
	while (Case != 0) {
		cin >> input;
		for (int i = 0; i < vector_size; i++) {
			for (int j = 0; j < vector_size; j++) {
				for (int k = 0; k < vector_size; k++) {
					if (v[i] + v[j] + v[k] == input) {
						cout << v[i] << " " << v[j] << " " << v[k] << endl;
						isResult = true;
						goto next;
					}
				}
			}
		}
	next:
		if (isResult == false) cout << "0";
		Case--;
		isResult = false;
	}
}

이 코드의 문제점 : 세 개의 소수를 세 개의 반복문으로 찾고 있다.

K가 1000 이하밖에 안돼서 런타임 시간이 오래안걸려서 상관없지만

만약 좀 더 큰 수였으면 런타임이 더욱 길어져서 문제를 못 풀수도 있다.