공부/백준(C++) - 2022~

백준 1929번: 소수 구하기 [C++]

상연 2022. 1. 16. 22:42

목차

코드

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;

int main(){
    int m, n;
    
    scanf("%d %d", &m, &n);
    
    bool* p_arr = new bool[n+1];
    
    for(int i=0; i<n+1; i++)
        p_arr[i] = true;
    
    int temp = sqrt(n)+1;
    p_arr[1] = false;
    for(int i=2; i<temp; i++){
        if(p_arr[i])
            for(int j=i*i; j<= n; j+=i){
                p_arr[j] = false;}
        
    }
                
    for(int k=m; k<=n; k++){
        if(p_arr[k]){
            printf("%d\n", k);
            }
           
    
    }
    delete[] p_arr;
}

 

풀이

아무래도 코딩 능력이 갈수록 떨어지는것 같다...

이번에 그냥 아무생각없이 에라토스테네스의 체라고 만들어서 문제를 풀었는데, 정작 진짜 에라토스테네스의 체를 사용해야하는 이번문제에서 시간초과가 뜨길래 1년전 꽤 빠른시간에 통과한 코드는 어떻게 해서 했나 봤더니...

지금은 귀찮아서 하라해도 안하는 가변 배열도 사용하고 야무지게 메모리 해제도 해준것도 모잘라서

에라토스테네스를 제대로 썼었다. 거기에다 입출력도 성능이 떨어지는 cout cin 이 아니라 scanf와 prinf를 써 주는 모습까지... 1년전 C++ 수업을 들었을때라 그런거였겟지?

https://wonsang98.tistory.com/185

 

백준 1978번: 소수 찾기 [C++]

https://www.acmicpc.net/problem/1978 1978번: 소수 찾기 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다. www.acmicpc.net 코드 #include #in..

wonsang98.tistory.com

https://wonsang98.tistory.com/186

 

백준 2581번: 소수 [C++]

https://www.acmicpc.net/problem/2581 2581번: 소수 M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 단, M이상 N이하의 자연수 중 소수가 없을 경우는

wonsang98.tistory.com

생각해보니 어차피 이전 자연수에서 배수로 지워지지 않았다는것 자체가 소수라는 것이기때문에

소수 판별을 따로 할 필요가 없었는데, 나는 이상하게 에라토스테네스의 체 개념을 쓰면서 소수 판별함수도 동시에 기용해서 소수 판별 함수로만 판별하는것보다는 빠르지만... 에라토스테네스의 체를 제대로 사용하는것보다는 훨씬 느린 이상한 방법으로 문제를 계속 풀어왔던것이다.

따라서 제대로 사용했다면 2부터 시작해서 그 수 자체는 놔두고 배수만 지워주고, 수가 올라가면서 그걸 반복하면 되는거였는데... 좀 안다고 생각해서 그냥 짚이는 대로 풀었더니 이런 참사가 발생한것 같다.