단계별 문제풀기 드디어 기본 수학2에 들어왔다.
첫 번째 문제는 매너 있게 쉬운 문제다.
사실 뭐.. 지금까지들의 문제도 다 쉽긴 했다.
입력할 수 N을 입력하고 1000이하의 자연수를 네 개 입력한다.
입력한 수들 중 소수를 찾는 프로그램을 작성한다.
소수란 3.141592.. 이런게 아니라 1보다 큰 자연수 중 1과 자신의 수를 약수로 가지는 수다.
즉 1, 자신의 수 빼고 나눠지는 수가 있으면 안된다. ex) 1, 2, 3, 5, 7 ....
방법 1.
뭐 아아주 단순하게 생각하면 입력한 수를 for문 돌려서 나눠 떨어지면 소수가 아닌것으로 검사하면 된다.
7이라 했을때 1 과 7은 검사대상 제외이므로 7을 2~6까지 계속 나눠보고 나눠 떨어지면 소수가 아니고 나눠떨어지는 수가 끝까지 안나오면 소수인 것으로 판별하면 된다.
그러나 그런 단순한 알고리즘을 짜면 좀 가오가 떨어지므로 효율적인(있어보이는) 알고리즘을 짜보자.
방법 2.
먼저 입력값을 K라고 봤을 때 K/2 까지만 검사를 하면 된다.
12의 약수는 1, 2, 3, 4, 6, 12 여기서 2부터 검사하므로 2에서 나눠져서 소수가 아닌게 판별난다.
2의 짝궁은 6, 3은 4 즉 12를 2부터 11까지 차례로 나눠서 검사를 하면 중복검사가 일어나게 되는 것이다.
그래서 뭐 12나누기 2~6 까지 하면 된다. 이미 뭐 2에서 걸러지지만..
다른 수들도 마찬가지로 13이면 13나누기 2부터 6까지 검사해서 나눠 떨어지지 않으면 소수인 것이다.
(나머지는 무시한다)
방법 3.
더 효율적인 방법으로는 제곱근을 이용한다.
K가 소수이기 위해서는 K의 제곱근보다 크지 않는 어떤 수로도 나눠지지 않는 것 이다.
즉 2부터 K의 제곱근 까지로 검사하는 범위가 더 줄었다. ex) K=23 ... 23의 제곱근은 4.xxx 이므로 23을 2, 3, 4로 나눠보고 나눠지지 않으면 소수이다.
이제 코드로
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
|
import java.util.Scanner;
public class Main {
//baekjoon 1978 소수찾기 수학2
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //수의 개수
int cnt = 0; //소수 카운트
for(int i=0; i<n; i++) { //n만큼 반복
int k = sc.nextInt();
boolean isPrime = true;
if(k == 1)
continue; //1은 소수가 아니므로 넘어간다.
for(int j=2; j<=Math.sqrt(k); j++) { //Math.sqrt() 함수는 제곱근을 구하는 함수이다.
if(k % j == 0) {
isPrime = false; //k를 j로 나눠서 나눠떨어지면 소수가 아니다.
}
}
if(isPrime) {
cnt++;
}
}
System.out.println(cnt);
}
}
|
cs |
이번 글 역시 아주 아주 쉬운 내용을 개떡같이 설명한 것 같다.
별수 있나....
'프로그래밍 > 백준 알고리즘 코드' 카테고리의 다른 글
백준 11653번 JAVA 소인수분해 [기본 수학2] (0) | 2021.04.27 |
---|---|
백준 2581번 자바 소수 [기본 수학2] 에라토스테네스의 체 (0) | 2021.04.26 |
백준 1011번 JAVA Fly me to the Alpha Centauri 수학[1] (0) | 2021.04.22 |
백준 10757번 java 큰 수 A + B (수학1) (0) | 2021.01.07 |
백준 2839번 자바 설탕 배달 [수학 1] (0) | 2021.01.07 |
댓글