• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

15번 질문입니다.

21.07.22 20:37 작성 조회수 89

0

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>

int main()
{
	//freopen("input.txt", "rt", stdin);
	int N;
	scanf("%d", &N);

	bool* isPrime = new bool[N+1];

	for (int i = 0; i < N+1; ++i)
		isPrime[i] = true;

	for (int i = 2; i < N+1; ++i)
		for (int j = 2 * i; j < N+1; j += i)
			isPrime[j] = false;

	int cnt = 0;
	for (int i = 2; i < N+1; ++i)
		if (isPrime[i])
			cnt++;

	printf("%d\n", cnt);


	if (isPrime)
		delete[] isPrime;

	return 0;
}

강의시간에 보여주신 코드와 비교했을 때, Big(O)만 따져보면 뭐가 이득인지 궁금합니다.

그리고 알고리즘 문제를 풀 때, 동적할당은 피해야하는지도 궁금합니다.

감사합니다.

답변 2

·

답변을 작성해보세요.

0

안녕하세요^^

소수의 개수를 구하는 방법은 위에 코드처럼 에라토스테네스체로 푸는게 가장 효율적인 코드입니다.

아래 코드처럼 수정하면 더 좋습니다.

#include <stdio.h>

int main()
{
	//freopen("input.txt", "rt", stdin);
	int N;
	scanf("%d", &N);

	bool* isPrime = new bool[N+1];

	for (int i = 0; i < N+1; ++i)
		isPrime[i] = true;
	
	int cnt=0;
	for (int i = 2; i < N+1; ++i){
		if(isPrime[i]){
			cnt++;
			for (int j = 2 * i; j < N+1; j += i)
				isPrime[j] = false;
		}
	}
	printf("%d\n", cnt);


	if (isPrime)
		delete[] isPrime;

	return 0;
}

0

안녕하세요^^

코드르 위와 같이 올리시면 제가 볼 수가 없습니다. {;}버튼을 이용해서 올려주시면 감사하겠습니다.

동적할당은 하는게 좋습니다. 강좌 뒤로 가면 vector를 사용하면서 동적할당을 많이 합니다.

cosacoke님의 프로필

cosacoke

질문자

2021.07.23

수정했습니다!