문제

numberOfPrime 메소드는 정수 n을 매개변수로 입력받습니다.

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하도록 numberOfPrime 메소드를 만들어 보세요.

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

10을 입력받았다면, 1부터 10 사이의 소수는 [2,3,5,7] 4개가 존재하므로 4를 반환
5를 입력받았다면, 1부터 5 사이의 소수는 [2,3,5] 3개가 존재하므로 3를 반환

풀이 1

class NumOfPrime {
    int numberOfPrime(int n) {
        int result = 0;
        boolean flag = false;
        // 함수를 완성하세요.

        if(n>3){
            result = 2;
            for(int i=4; i<=n; ++i){
                flag = false;
                for(int j=2; j<i; j++){
                	if(i%j == 0) flag = true;
                }
            if(!flag) result++;
        }
        }else{
        	result = n-1;
        }

        return result;
    }

	public static void main(String[] args) {
		NumOfPrime prime = new NumOfPrime();
		System.out.println( prime.numberOfPrime(10) );
	}
}

풀고나서 다른 사람들의 풀이를 보니 내가 너무 어렵게 생각해서 풀었나 싶다. 소수가 나오지 않는 수의 범위는 4부터라서 처음 if문의 범위를 n>3으로 잡았다. 즉, 4 이상의 수가 들어오면 이중 for문을 통해 소수가 맞는지 아닌지 판별하여 result에 +1씩 해주는 방식이다. 4 미만의 수가 들어오면 그 수 -1을 한 것이 result가 된다.

풀이 2

class NumOfPrime {
    int numberOfPrime(int n) {
        int result = 0;
        
        for(int i=2; i<=n; i++){
            for(int j=2; j<=i; j++){
                if(j == i){
                    ++result;
                } else if(i%j == 0){
                    break;
                }
            }
        }

        return result;
    }

    public static void main(String[] args) {
        NumOfPrime prime = new NumOfPrime();
        System.out.println( prime.numberOfPrime(10) );
    }

}

애초에 그냥 1이 소수가 아니기 때문에 2부터 범위를 잡아서 시작해도 되는데 나는 너무 세부적으로 나누려고 한 것 같다. 풀이2처럼 푸는 것이 정석.