문제
주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
입력
첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
출력
주어진 수들 중 소수의 개수를 출력한다.
설계 참고내용 및 과정.

소수를 찾는 특정 방식
소수의 정의: 1보다 큰 자연수 중 1과 자기 자신만을 약수로 가지는 수.
2 3 5 7
int num = s.nextInt();
int arr = new int[num];
for(int k=0; k<arr.length();k++){
A=arr[k];
for(int i = 2; i<A; i++ ){
if(A%i==0 ){
break;l
}
else if(A==2){
cnt++;
}
else
cnt++;
}
}
System.out.print(cnt);
b: A보다 작고 1보다 큰 모든 수
-> cnt++로 자꾸 하다가 애먹어서... num--로 해결보았다.(이거 하나 생각하는데 40분 씀;ㅠ)
<작성 답안> ( 제출 성공)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int num = s.nextInt(); // 입력갯수
int[] arr = new int[num];
for (int j = 0; j < num; j++) { // 입력갯수만큼의 값을 받아오기.
arr[j] = s.nextInt();
}
for (int k = 0; k < arr.length; k++) {// 그 배열칸이 소수인지 아닌지 판별
int A = arr[k];
if (A == 1) {
num--;// 전체 갯수에서 소수가 아니니 빼주기.
continue;
}
if (A == 2) { // 소수 비교 중에 2보다 작은 수는 1말고는 없음. 1은 나누는 대상이 아님.
continue;
}
for (int i = 2; i < A; i++) { //2부터 A-1까지의 수로 나눠줌.
if (A % i == 0) {
// 1을 제외한 그 입력받은 수보다 작은 값부터 쭉 나눠서 나머지가 0인 값이 있는지 확인
num--; // 전체 갯수에서 소수가 아니니 빼주기.
break;
}
}
}
System.out.print(num);
}
}
-> break문은 이중 반복문일지라도 그 속한 작은 반복문만 파괴.(그 밑에 cnt++; 같은 것이 있다면 그것 까지 반복하고서 큰 반복문으로 돌아감)
-> continue문은 그 속한 반복문의 다음 반복으로 돌아가 실행.
<정답>
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int count = 0;
for(int i = 0; i < N; i++) {
// 소수인경우 true, 아닌경우 false
boolean isPrime = true;
int num = in.nextInt();
if(num == 1) { // 1 인경우 다음 반복문으로
continue;
}
for(int j = 2; j <= Math.sqrt(num); j++) {
if(num % j == 0) {
isPrime = false; // 소수가 아니므로 false 로 바꿔줌
break;
}
}
if(isPrime) { // 소수인경우 count 값 1 증가
count++;
}
}
System.out.println(count);
}
}
-> boolean과 return을 사용했다. 확실히 이게 편할듯.
->Math.sqrt 라는 제곱근을 구하는 메서드를 사용해서 간편하게 풀었다.
<수정 및 보완>
Math.Sqrt()란?
java.lang.Math클래스의 sqrt() 메서드입니다
double타입의 인수를 전달하면 인수에 대한 double타입의 제곱근 값을 리턴해줍니다
제곱근은 음수가 나올 수 없으므로 음수를 입력하면 NaN(Not a Number)을 리턴해줍니다
Math.Sqrt() 사용방법
Math.Sqrt(double d);
사용하여 d의 제곱근을 출력합니다
Math.Sqrt() 사용예제
import java.io.IOException;
public class MathSqrt {
public static void main(String[] args) throws IOException {
System.out.println("9의 제곱근 : " + Math.sqrt(9));
System.out.println("20의 제곱근 : " + Math.sqrt(20));
System.out.println("50의 제곱근 : " + Math.sqrt(50));
System.out.println("100의 제곱근 : " + Math.sqrt(100));
System.out.println("NaN의 제곱근 : " + Math.sqrt(Double.NaN));
System.out.println("-1의 제곱근 : " + Math.sqrt(-1));
}
}
Math.sqrt()메서드를 사용한 예제입니다
double형태로 인수를 넣으면 인수의 제곱근을 출력합니다
참고로 NaN 및 -1의 값을 넣으면 "NaN"을 출력해줍니다
결과
Math.sqrt 설명 출처: https://crazykim2.tistory.com/599
정답 출처: https://st-lab.tistory.com/80
[백준] 1978번 : 소수 찾기 - JAVA [자바]
https://www.acmicpc.net/problem/1978 1978번: 소수 찾기 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다. www.acmicpc.net 문제 드디어 새로운 카
st-lab.tistory.com
'📟java > 백준' 카테고리의 다른 글
백준 4948 자바 (0) | 2022.11.16 |
---|---|
백준 11653 자바 (0) | 2022.11.15 |
백준 2839 자바 (0) | 2022.11.14 |
백준 10250 자바 (0) | 2022.11.14 |
백준 1193 자바 (0) | 2022.11.13 |