코딩테스트(Level 0~1)

[JAVA, Programmers] 소수 찾기(자바)

justdoIT0730 2022. 12. 3. 17:06
728x90
728x90

1. 문제 설명

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

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

 

2. 제한 조건

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

 

3. 입출력

n result
10 4
5 3

 

4. 입출력 설명

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

- 입출력 #2
1부터 5 사이의 소수는 [2,3,5] 3개가 존재하므로 3를 반환

 

5. 풀이(시간 초과)

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

1. 2 이상의 수를 2부터 n까지 각각 나눈다.

2. 나머지가 0일 때만 cnt가 추가된다. 

3. 반복할 때 cnt가 1일 때(소수의 경우 나누기를 2부터 시작하므로 자기 자신과 나눌 때에만 나머지가 0이 된다.)만 answer를 추가한다. 

 

n까지 모든 수를 다 나눠본 뒤에 답이 나와서 시간 초과가 나온 것 같다.

최댓값이 1000000인 것을 감안한다면 시간 초과는 당연한 결과이다..

 

728x90

 

6. 최종 풀이

class Solution {
	public int solution(int n) {
	int answer =0;
	for(int i =2; i<=n; i++) {	
		int cnt =0;
			for(int y =1; y<=Math.sqrt(i); y++) {
				if(i%y==0) {cnt++;}
				if(cnt>1) break;
			}
		if(cnt==1) {answer++;}
	}
	return answer;
	}
}

1. n을 1부터 n값의 제곱근 값까지의 수로 나누기를 하여 나머지가 0인 경우 cnt를 저장

2. 만약 cnt가 2 이상일 경우 반복 종료

3. 모든 반복 후에도 cnt가 1이라면 answer에 추가

 

나눌 때 반복할 경우의 수를 제곱근만큼 낮췄고, 나누어 0인 경우가 2번 이상일 때 반복을 멈춰서 시간 초과를 하지 않을 수 있었다.

 

728x90
728x90