[프로그래머스/java] 소수 찾기 *[에라스토테네스의 체] 설명
리트리버J
·2021. 1. 3. 18:00
728x90
1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.
소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)
<에라스토테네스의 체>
1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다.
2. 2는 소수이므로 오른쪽에 2를 쓴다.
3. 자기 자신을 제외한 2의 배수를 모두 지운다.
4. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다.
5. 자기 자신을 제외한 3의 배수를 모두 지운다.
6. 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다.
7. 자기 자신을 제외한 5의 배수를 모두 지운다.
8. 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다.
9. 자기 자신을 제외한 7의 배수를 모두 지운다.
10. 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.
<JAVA 코드 : 주석 추가>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
package com.codeup;
public class CodeUp100 {
public static void main(String[] args) {
int n = 100;
int answer = 0;
/*
* 소수 → false, 비소수 → true가 된다.
* n+1로 길이를 설정하는 이유 :
* i가 n까지 포함되어 checked[n]으로 들어가는데,
* 배열의 index는 length보다 1작기 때문이다.
*/
boolean[] checked = new boolean[n+1];
// 구하고자 하는 숫자까지 숫자 2부터 반복문을 실행한다. (1은 소수가 아님)
for (int i = 2; i <= n; i++) {
// 첫번째) 2는 소수이므로 !false → true
// 두번째) 3은 소수이므로 !false → true
// 세번째) 4는 비소수이므로 !true → false
if (!checked[i]) {
answer++;
System.out.println(i);
}
// 첫번째) j += i를 통해 2의 배수들을 true로 바꾼다.
// 두번째) j += i를 통해 3의 배수들을 true로 바꾼다.
// 세번째) j += i를 통해 4의 배수들을 true로 바꾸지만, 이미 2의 배수로 true로 변경되었다.
for (int j = i; j <= n; j += i) {
if (!checked[j])
checked[j] = true;
}
}
System.out.println("총 소수의 갯수 : " + answer + "개");
}
}
|
cs |
<나의 풀이>
에라토스테네스의 체를 활용하여 풀었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Solution {
public int solution(int n) {
int answer = 0;
boolean[] check = new boolean[n+1];
for(int i = 2; i <= n; i++){
if(!check[i]) answer++;
for(int j = i; j <= n; j += i){
if(!check[j]) check[j] = true;
}
}
return answer;
}
}
|
cs |
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
728x90
'알고리즘 > 코딩테스트' 카테고리의 다른 글
[프로그래머스/java] 문자열 다루기 기본 (0) | 2021.01.08 |
---|---|
[프로그래머스/java]서울에서 김서방 찾기 (0) | 2021.01.03 |
[프로그래머스/java]수박수박수박수박수박수? (0) | 2021.01.03 |
[프로그래머스/java] 문자열을 정수로 바꾸기 (0) | 2021.01.03 |
[프로그래머스/java] 시저 암호 (0) | 2021.01.03 |