제이슨의 개발이야기

[코딩테스트] 소수찾기 level 1 Java 프로그래머스 본문

코딩테스트

[코딩테스트] 소수찾기 level 1 Java 프로그래머스

제이쓰은 2021. 6. 8. 10:39
728x90
반응형

 https://programmers.co.kr/learn/courses/30/lessons/12921

 

코딩테스트 연습 - 소수 찾기

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상

programmers.co.kr

 

안녕하세요! 오늘은 프로그래머스에서 소수 찾기 란 문제를 풀어봤습니다

 

이 문제는 level 1 이라서 굉장히 쉬울거라고 생각하고 문제를 풀어봤는대 생각보다 어려웠습니다... 

 

개인적으로 level 2 라고 해도 전혀 이상하지 않은 문제인거같습니다

 

이 문제를 풀려면 꼭 알아야 하는 것이 있는대 그것은 

 

에라토스테네스 체 입니다

에라토스테네스 체를 이용해서 문제를 풀어야 하는대 

예를 들면 1~31 사이에 소수의 갯수를 찾아야 한다면 

 

먼저 루트 31의 값을 구하면 5.xxx가 나옵니다

그래서 2~5의 배수를 빼면 그 나머지 수들은 소수에 해당하기 때문에 그 나머지만 카운트 하면 문제를 풀 수 있습니다

 

기본적으로 에라토스테네스 체 라는 것을 알아야 문제를 풀 수 있는것으로 보입니다 ㅠㅠ 

 

문제 설명

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 

소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)

제한 조건

  • n은 2이상 1000000이하의 자연수입니다.

입출력 예

 

n result
10 4
5 3

 

public class Solution {
    public int solution(int n) {
        int answer =n-1;
        int root=(int)Math.sqrt(n);
        int [] array = new int[n+1];
        for(int i = 0 ; i<=n ; i++){
            if(i==2){
                array[i]=-1;
            }
            array[i]=0;
        }
        for(int i=2; i<=root ; i++){
            for (int  j = i; j*i<=n ;j++){
                array[j*i]=-1;
            }
        }
        for(int  i = 2 ;i<=n ; i++){
            if(array[i]==-1){
                answer--;
            }
        }
        return answer;
    }
}
728x90
반응형