Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- priority_queue
- Lambda
- MySQL
- BOJ 2012
- BOJ 4485
- BOJ 11726
- 플로이드 와샬
- BOJ 5568
- BOJ 1912
- DP
- BOJ 1926
- BOJ 1074
- BOJ 1697
- BOJ 2213
- BOJ 6593
- BOJ 2146
- 다익스트라
- BOJ 4948
- AWS
- 분할과 정복
- BOJ 5791
- BOJ 2407
- 조합 알고리즘
- BOJ 2234
- javascript
- Coercion
- spring security
- BOJ 2167
- springboot
- serverless
Archives
- Today
- Total
고인물을 지양하는 블로그
BOJ 4948 베르트랑 공준 본문
https://www.acmicpc.net/problem/4948
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