smooth waters run deep

공부내용/알고리즘

소수

yeon_11 2020. 10. 20. 17:50

소수를 구하는 방법에는 세 가지가 있다.

 

 

 

① (2부터 자기자신-1) 까지의 모든 수로 나누어보기

 

소수의 정의 = 1과 자기자신으로 나누어떨어지는 수 를 이용하는 방법!

모든 수로 나누어 보는 과정을 거쳐야하기 때문에, 시간초과 위험 + 비효율적이다.

public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		
        //2부터 num-1 까지의 모든 수를 체크
        for(int i=2; i<=num; i++){
        	if(check(i))
            	System.out.println(i);
        }
	}
    
	public static boolean check(int num){
		boolean ans = false;
        int i=2;
		
        //나머지=0이면 소수X
		while(i<num){ 
			if(num%i == 0) 
				break;
			else i++;
		}

		if(i == num) //소수O
			ans = true;
        
        return ans;
	}

 

 

② 제곱근 이용하기 - (2부터 제곱근)까지의 수로 나누어보기

 

①처럼 모든 수로 나누어보지 않고, 제곱근까지의 수까지만 체크하면 된다.

public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();

		//2부터 루트num까지의 수만 체크
        //Math.sqrt() 리턴값은 double형이다. int형으로 바꾸어주기
		
        for(int i=2; i<=(int)Math.sqrt(num); i++){
        	if(check(i))
            	System.out.println(i);
        }
	}

	public static boolean check(int num){
		boolean ans = false;
		int i=2;
        
		while(i<num){
			if(num%i == 0)
				break;
			else i++;
		}

		if(i == num)
			ans = true;

		return ans;
	}

 

 

③ 에라토스테네스의 체

 

①방법 : num까지의 모든 수를 돌며 소수인지 확인한다. ( 2~num-1까지의 수로 나누어보는 과정 ) - 비효율적

②방법 : Math.sqrt(num)까지의 수를 이용해 소수인지 확인한다. - 효율적

 

에라토스테네스의 체는 2의배수, 3의배수, ... , x의 배수인 수들을 제외하고 나머지 수를 소수로 판단한다.

조금더 풀어서 설명하면

2를 제외한 모든 2의 배수를 체크한다. -> 3을 제외한 모든 3의 배수를 체크한다. -> ... 와같은 과정을 통해 소수가 아닌 수를 걸러낸다. 

나머지 체크가 안된 수 = 소수 로 판단한다.

public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();

		//2~num까지의 수가 들어있는 배열 만들기
		//check[i]=false 이면 소수인거
		
        boolean[] check = new boolean[num+1];
		for(int i=2; i<=num; i++){
			check[i] = false;
		}

		for(int i=2; i<=(int)Math.sqrt(num); i++){
			if(check[i]) //이미 체크한거는 다시 체크X
				continue;
			for(int j=i+i; j<=num; j+=i){
            	if(!check[j])
                	check[j] = true; //j를 제외한 j의 배수 체크하기
			}
		}

		for(int i=2; i<=num; i++){
			if(!check[i])
				System.out.println(i);
		}
	}

 

 

 

소수 관련 문제 (백준)

 

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

www.acmicpc.net

 

1978번: 소수 찾기

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

www.acmicpc.net

 

2581번: 소수

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.  단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

www.acmicpc.net

 

1747번: 소수&팰린드롬

어떤 수와 그 수의 숫자 순서를 뒤집은 수가 일치하는 수를 팰린드롬이라 부른다. 예를 들어 79,197과 324,423 등이 팰린드롬 수이다. 어떤 수 N (1 ≤ N ≤ 1,000,000)이 주어졌을 때, N보다 크거나 같고,

www.acmicpc.net

 

1990번: 소수인팰린드롬

151은 소수이면서 동시에 팰린드롬이기 때문에 소수인 팰린드롬이다. 팰린드롬이란 앞으로 읽어나 뒤로 읽으나 같은 수를 말한다. 예를 들어 1234는 앞으로 읽으면 1234지만, 뒤로 읽으면 4321이 되�

www.acmicpc.net

 

4948번: 베르트랑 공준

베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다. 이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼

www.acmicpc.net

 

'공부내용 > 알고리즘' 카테고리의 다른 글

최대공약수 & 최소공배수  (0) 2020.11.22
조합 nCr  (0) 2020.11.11
순열 nPr  (0) 2020.11.11
부분집합  (0) 2020.11.08
카운팅 정렬 (Counting Sort)  (0) 2020.11.03