문제 설명

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

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

 

제한 조건

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

 

입출력 예

n result
10 4
5 3
  • 입출력 예 #1 : 1부터 10 사이의 소수는 [2,3,5,7] 4개가 존재하므로 4를 반환
  • 입출력 예 #2 : 1부터 5 사이의 소수는 [2,3,5] 3개가 존재하므로 3를 반환

 

시간 초과 코드

/*
boolean isPrime = true;
이렇게 처음에 초기화를 하면안된다. 한 번 isPrime이 false가 되면,
그 다음 i에 대해 다시 true로 되돌려주지 않기 때문에
계속 false로 남아서 소수 판정이 전부 실패함
*/

class Solution {
    public int solution(int n) {
        int answer = 0;
        boolean isPrime;
        
        for (int i = 2; i <= n; i++) {
            isPrime = true; // isPrime = true;는 각 i에 대해 처음엔 소수라고 가정하고 시작하는 것.

            for (int j = 2; j < i; j++) { // 어떤 수 i가 소수인지 판단하려면, 2부터 i - 1까지 나누어 떨어지는 수가 하나라도 있는지 확인하면 돼.
                if (i % j == 0) {
                    isPrime = false; // 
                    break;
                }
            }

            if (isPrime) {
                answer++;
            }
        }

        return answer;
    }
}

 

통과 코드

class Solution{
	public int solution(int n){
		int answer = 0;
		
		for (int i = 2; i <= n; i++){
            if (isPrime(i)) {
                answer += 1;
            }
		}
		
		return answer;
	}

	private boolean isPrime(int n){
		for (int i = 2; i * i <= n; i++){ // 왜 i*i인지
			// 나눠 떨어질 경우
			if (n % i == 0){
				return false; // 나누어 떨어지는 경우가 왜 false인지
			}
		}
		return true;
	}
}

 

Developer Quarterly