-
소수찾기알고리즘/프로그래머스 2020. 10. 19. 00:33
출처 - https://programmers.co.kr/learn/courses/30/lessons/12921
코딩테스트 연습 - 소수 찾기
1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상
programmers.co.kr
package com.programmers; import java.util.*; /* 2<= n <= 1000000 n result 10 4 5 3 [2,3,5,7] -> count 4 [2,3,5] - > 3 */ public class FindPrimeNumber { public int solution(int n) { // 11,12에서 시간초과 됨. /* * // 모든 수를 다 돌아서 시간 복잡도가 O(N)이다. * * int answer = 0; * * for(int i=2; i<=n; i++) { boolean isPrime = true; for(int j=2; j<i; j++) { * if(i % j == 0) { isPrime = false; break; } } if(isPrime) answer++; } * * return answer; */ // 에라토스테네스의 체 // 특정 숫자의 제곱근 까지만 약수의 여부 검증 시 O(N^1/2)의 시간 복잡도 걸림 // 기본값 false임. /*boolean[] sosu = new boolean[n + 1]; for (int i = 2; i < sosu.length; i++) { sosu[i] = true; } for (int i = 2; i * i <= n; i++) { if (sosu[i] == false) continue; for (int j = i * i; j <= n; j += i) { sosu[j] = false; } } int answer = 0; for (int i = 2; i <= n; i++) { if (sosu[i]) { answer++; } }*/ // return answer; //방법2 int result = 0; boolean[] prime = new boolean[n + 1]; for (int i = 2; i <= n; i++) for (int j = 2 * i; j <= n; j += i) // 판별 배수 삭제. prime[j] = true; for (int i = 2; i <= n; i++) if (!prime[i]) result++; return result; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); FindPrimeNumber findPrimeNumber = new FindPrimeNumber(); // 10 > 4 System.out.println("result : " + findPrimeNumber.solution(n)); } }