자바 제곱근으로 소수구하기 Math.sqrt() 이용!!!!!
Math.sqrt(num) : num의 제곱근
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0)
return false;
}
예)
9의 제곱급이다. 그럼 루트 9,
i는 2, 3
루트 9는 3으로 나누어 떨어진다.
나누어떨어지니 9는 false로 리턴
예2)
17의 제곱근
i는 2 3 4
다 나누어 떨어지지 않으므로 소수이다!
매우간단 😉
num의 제곱근까지만 검사하는 이유!
num을 A x B 의 합성수 (num= A x B) 라고 볼 때 아래와 같이 부등식을 세울 수 있다
1 <= A, B < Number
여기서 만약 A와 B가 num의 제곱근보다 커지면 위 부등식에 모순이 생긴다.
따라서 합성수 num= A x B 에서 A와 B 중 적어도 하나는 num의 제곱근보다 작거나 같다.
따라서 소수를 판별할 때 굳이 num-1 까지가 아닌 num의 제곱근까지만 검사하면 된다.
백준 문제 1978번이다.
소수 찾기
문제
주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
입력
첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
출력
주어진 수들 중 소수의 개수를 출력한다.
예제 입력 1
4
1 3 5 7
예제 출력 1
3
방법1.
package Day1030;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class B1978 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine(); // N 은 쓰지 않음.
int count = 0;
StringTokenizer st = new StringTokenizer(br.readLine(), " "); // 공백 기준으로 끊어줌
while (st.hasMoreTokens()) { // st.hasMoreTokens() : StringTokenizer에 사용할 수 있는 토큰이 더 있는지 확인ㄴ
boolean isPrime = true;
int num = Integer.parseInt(st.nextToken());
if (num == 1)
continue; // 소수는 1을 포함 안하므로 넘어가기
// Math.sqrt(num) : num의 제곱근
// 2 ~ num의 제곱근까지 중 나누어 떨어지는 약수가 있는지 판별
// num = 2 의 경우는 자연스럽게 for문을 검사하지 않게 됨
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
isPrime = false;
break;
}
}
// 만약 나눠떨어지지 않는다면 소수이므로 카운트
if (isPrime) {
count++;
}
}
System.out.println(count);
}
}
방법2. 메서드 호출
코드가 좀 지저분한 것 같아서 메서드 호출 방식으로 해보았다.
package Day1030;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class B1979_2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine(); // N 은 쓰지 않음.
int count = 0;
StringTokenizer st = new StringTokenizer(br.readLine(), " "); // 공백 기준으로 끊어줌
while (st.hasMoreTokens()) { // st.hasMoreTokens() : StringTokenizer에 사용할 수 있는 토큰이 더 있는지 확인ㄴ
int num = Integer.parseInt(st.nextToken());
// 메서드에 num 대입해서 호출
if (isPrime(num)) {
count++;
}
}
System.out.println(count);
}
// 메서드 호출 부분
public static boolean isPrime(int num) {
if (num == 1)
return false;
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0)
return false;
}
return true;
}
}
위가 방법2
아래가 방법1
'알고리즘 공부 > 백준 문제풀이' 카테고리의 다른 글
[백준] 1094 : 막대기 (JAVA) (0) | 2022.11.02 |
---|---|
[백준] 11651 : 좌표 정렬하기2 (JAVA) - 람다식, Comparator (0) | 2022.11.02 |
[백준] 5063 : TGN (JAVA) (0) | 2022.10.29 |
[백준] 11945 : 뜨거운붕어빵 (JAVA) (0) | 2022.10.28 |
[백준] 10833 : 사과 (JAVA) (0) | 2022.10.28 |