문제 설명 |
1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) |
제한 조건 |
|
입출력 예 |
|
n | return |
10 | 4 |
5 | 3 |
|
나의 풀이
1. answer는 모든 숫자의 개수 (n-1)
2. n이 4 이상의 수이면 4부터 n까지 for문을 돌림
3. 2부터 위 n의 위치(i)의 제곱근 +1 까지 for문을 돌려 나누어 떨어지는 순간 answer--
(소수가 아닐 경우 answer에서 제거하는 방식)
class Solution {
public int solution(int n) {
int answer = n-1;
for (int i=4; i<=n; i++) {
for (int j=2; j<Math.sqrt(i)+1; j++) {
if (i%j == 0)
{
answer--;
break;
}
}
}
return answer;
}
}
* 이중for문에서 n/2+1까지 돌리면 효율성0, 테스트 통과X -> Math.sqrt를 사용하면 통과
* 이 문제는 에라토스테네스의 체를 활용하여 풀이해야함
JAVA 1코드 정리
1. 소수 여부를 판별하는 배열 checked 선언
2. 2부터 n까지 반복
3. j는 n의 위치(i)부터 n까지 반복하여 소수에 해당하지 않는 수는 true 처리
4. false만 카운트
class Solution {
public int solution(int n) {
int answer = 0;
boolean[] checked = new boolean[n + 1];
for (int i = 2; i <= n; i++) {
if (!checked[i])
answer++;
for (int j = i; j <= n; j += i) {
if (!checked[j])
checked[j] = true;
}
}
return answer;
}
}
JAVA 2코드 정리
1. i는 2부터 n까지, j는 2부터 i까지 이중 for문
2. i가 j로 나누어 떨어지면 다음 반복, 아니면 result에 추가
(왜 if(j==i)로 result를 계산하는지 의문...)
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;
}
}
더보기
또한 소수 찾기의 가장 큰 핵심은 '에라토스테네의 체'라는데 아무리 읽어도 내가 코드했던 부분이랑 뭐가 다른지 의문이었다.
그랬는데 /2 때문이었다니.. 허무...
Math.sqrt와 /2 의 계산 효율성 차이가 큰 줄 처음 알았다.
'프로그래머스 > Java | Level1' 카테고리의 다른 글
[프로그래머스/Java]Level1 - 나누어 떨어지는 숫자 배열 (0) | 2021.01.17 |
---|---|
[프로그래머스/Java]Level1 - 문자열 내 p와 y의 개수 (0) | 2021.01.17 |
[프로그래머스/Java]Level1 - 모의고사 (0) | 2021.01.16 |
[프로그래머스/Java]Level1 - 2016년 (0) | 2021.01.16 |
[프로그래머스/Java]Level1 - K번째 수 (0) | 2021.01.07 |