강의

멘토링

커뮤니티

Inflearn Community Q&A

co22oc5076's profile image
co22oc5076

asked

Introduction to Algorithm Problem Solving for IT Employment (with C/C++): Coding Test Preparation

15번 질문입니다.

Written on

·

149

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)만 따져보면 뭐가 이득인지 궁금합니다.

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

감사합니다.

C++코테 준비 같이 해요!

Answer 2

0

codingcamp님의 프로필 이미지
codingcamp
Instructor

안녕하세요^^

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

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

#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

codingcamp님의 프로필 이미지
codingcamp
Instructor

안녕하세요^^

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

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

cosacoke님의 프로필 이미지
cosacoke
Questioner

수정했습니다!

co22oc5076's profile image
co22oc5076

asked

Ask a question