📟java/백준

백준 1978 자바

하얀성 2022. 11. 15. 10:09

문제

주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.

 

입력

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

출력

주어진 수들 중 소수의 개수를 출력한다.

 


설계 참고내용 및 과정.

1000이하의 소수

소수를 찾는 특정 방식
소수의 정의: 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