연습문제
🔥 소수 찾기 🔥
1부터 입력받은 숫자 n사이에 있는 소수의 개수를 반환하는 함수 solution을 완성해보자.
소수는 1과 자기자신으로만 나누어지는 수를 의미함
n | return |
---|---|
10 | 4 |
5 | 3 |
import java.util.*;
class Solution {
public int solution(int n) {
List<List<Integer>> arr = new ArrayList<>();
int answer = 0;
for(int i=1;i<n+1;i++){
List<Integer> num = new ArrayList<>();
for(int j=1;j<i+1;j++){
if(i%j==0){
num.add(j);
}
}
arr.add(num);
if(arr.get(i-1).size()==2){
answer +=1;
}
}
return answer;
}
}
이렇게 풀어서 테스트는 통과했는데!
효율성과 테스트 10,11,12에서 모두 시간초과가 발생했다 ㅠㅠ
질문하기에 많은 분들이 에라토스테네스의 체를 이용해야 통과를 할 수 있다고 한다.
가장 도움이 되었던 글과 코드를 바탕으로 다시 풀어보자면!!
이러한 방법으로 7까지 진행하고 나면 8,9,10은 이미 소수가아니라고 앞에서 정의했기 때문에 넘어갈 수 있고 덕분에 시간을 절약하게 됩니다.
class Solution {
public int solution(int n) {
int answer = 0;
int[] arr = new int[n+1];
for(int i=0;i<=n;i++){
arr[i] = i;
}
arr[1] = 0;
for(int i=2;i<=n;i++){
if(arr[i]==0)continue;
for(int j=i*2; j<=n; j+=i){
arr[j] = 0;
}
}
for(int i=0;i<arr.length;i++){
if(arr[i] != 0){
answer++;
}
}
return answer;
}
}
1. 제곱근을 이용한 풀이
class Solution {
public int solution(int n) {
int answer = 0;
for(int i = 2; i <= n; i++){
int j = 2;
int cnt = 0;
while(j <= (int)Math.sqrt(i)){
if(i % j == 0){ //나누어떨어지면 소수가 아님
cnt += 1; //소수가 아닐때 cnt에 +1
break; //break가 없으면 효율성 통과 불가능
}
j += 1;
}
if(cnt == 0) answer += 1;
}
return answer;
}
}
에라토스테네스의 체...
소수를 저렇게 간단히 구할 수 있었다니