고인물을 지양하는 블로그

BOJ 4948 베르트랑 공준 본문

Algorithms/ACMICPC(백준)

BOJ 4948 베르트랑 공준

yunjaeGong 2019. 7. 16. 18:58

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

 

4948번: 베르트랑 공준

문제 베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다. 이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼프가 1850년에 증명했다. 예를 들어, 10보다 크고, 20보다 작거나 같은 소수는 4개가 있다. (11, 13, 17, 19) 또, 14보다 크고, 28보다 작거나 같은 소수는 3개가 있다. (17,19, 23) n이 주어졌을 때, n보다 크고, 2n보

www.acmicpc.net

1번 풀이

#include <cstdio>
#include <math.h>
int main() {
    int n,cnt;
    while(scanf("%d",&n), (n)) {
        cnt = 0;
        for(int i=n+1;i<=2*n;++i) {
            int j=2, max = (int)sqrt(i);
            for(;j<=max;++j) {
                if(i%j == 0)
                    break;
            }
            if(j == max+1) cnt++; // 중간에 나누어 떨어지지 않으면 소수
        }
        printf("%d\n",cnt);
    }
}

 

 

x가 소수인지 알아보기 위해 2 ~ //(\sqrt{n}//)까지 나눠보는 고전적인 방법으로 문제를 해결했다. 답은 맞았지만, 너무 오래걸렸다.

 

처음 제출한 코드에서는 for loop 조건에 max 대신 (int)sqrt(i)가 들어있었는데, 632ms가 걸렸다. 매 번 조건을 확인할 때마다 제곱근 연산이 이루어져서 오버헤드가 발생한 것으로 생각된다. 이후 max로 대치한 후에는 수행 시간이 조금 줄어든것을 볼 수 있다.

 

그럼에도 다른 분들에 비해 너무 오래 걸려 코드를 공개하신 몇 분의 코드를 살펴봤다.

 

 

배열 prime[i]를 다음과 같이 정의하자.

      prime[i]: 정수 i가 소수이면 true / 아니면 false

set prime[] to true

prime [1] = false
for i in 2 ~ max {
	if prime[i] is true // i 가 소수이면
    	for j in 2*i to max by j += i // 소수의 배수들에 대해
            prime[j] = false
            // 소수의 배수들은 소수가 아님
}

즉 범위 내 모든 정수들에 대해 소수만 남기고 모두 제거한다. 이후에는 단순히 n ~ 2n 범위 내 prime[k]가 몇개인가 세면 문제를 해결 할 수 있다.

 

 

2번 풀이

#include <cstdio>
#include <cstring>
#define maxN 246912
bool prime[maxN];
//false가 소수의 갯수
int main() {
    int in;
    memset(prime,true,sizeof(prime));
    prime[1] = true;
    for(int i=2;i<=maxN;i++) {
        if(prime[i]) // i가 소수이면
            for(int j=i*2;j<=maxN;j+=i) // 소수의 배수들에 대해
                prime[j] = false; // 소수가 아님을 표시
    }

    while(scanf("%d",&in),(in)) {
        int ret = 0;
        for(int i=in+1;i<=2*in;++i)
            if(prime[i])
                ret += 1;
        printf("%d\n", ret);
    }
}

 

 

'Algorithms > ACMICPC(백준)' 카테고리의 다른 글

BOJ 2167 2차원 배열의 합  (0) 2019.07.23
BOJ 1912 연속합  (0) 2019.07.17
BOJ 11726 2 x n 타일링  (0) 2019.07.15
BOJ 5791 거의 최단 경로  (0) 2019.07.14
BOJ 6593 상범빌딩  (0) 2019.07.04
Comments