성장 이야기/Java

[백준][자바] 1978번 : 소수찾기

treewoodman 2021. 11. 11. 14:43
반응형

https://www.acmicpc.net/problem/1978

 

1978번: 소수 찾기

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

www.acmicpc.net


단계별 문제 풀기 기본 수학 2에 왔다

하루에서 알고리즘 문제 1~2문제 풀기씩 목표를 잡고 있는데

벌써 여기까지 왔다.

 

첫 문제 이다 보니까

나름 쉬운 문제가 나온 거 같다

 

첫 문제는 소수 찾기이다

소수란 1과 자기 자신만을 약수로 같은 수를 소수라고 한다.


  • 문제

  • 예제
  • 문제 풀이

소수를 구할 수 있는 방법은 여러가지가 있다.

 

첫 번째 방법은

소수는 1과 자기 자신만이 약수를 가지기 때문에 주어진 수 전까지 하나하나씩

나누어 보면 알 수 있다

주어진 수 전까지 나누어 떨어지는 수가 있으면 소수가 아니고 없다면 소수 일 것이다

 

하지만 이 방법으로 코드를 짠다면 효율적인 코드가 아닐 것이다 

 

두 번째 방법은

주어진 수의 제곱근을 이용하는 것이다.

만약 주어진 수가 47이라고 하자 

47의 제곱근은 6.8 XXXXXX....이다

47을 제곱근 보다 작은 수 2,3,4,5,6으로 나눈다

나누어 떨어지지 않는다면 소수이고 나누어 떨어진다면 소수가 아니다

두 번째 방법으로 코드를 짜면 첫 번째 방법보다 효율적인 알고리즘 일 것이다.

 

 

  • 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		int count = 0; //소수 개수 카운트
		int N = Integer.parseInt(br.readLine()); // 수의 개수를 N에 입력받는다
		
		st = new StringTokenizer(br.readLine(), " "); //StringTokenizer를 통해 문자열을 분리한다

		for (int i = 0; i < N; i++) {
			int num = Integer.parseInt(st.nextToken());
            
			boolean check = true; // 소수인경우 true, 아닌경우 false
            
			if (num == 1) { //1은 소수가 아니라서 계속 진행한다
				continue;
			}

			for (int j = 2; j <= Math.sqrt(num); j++) { 
				if (num % j == 0) {
					check = false;
				}

			}
			if (check) { //check가 true이면 소수이다 count에 누적시켜준다
				count++;
			}
		}
		System.out.println(count); //소수 개수 출력
	}

}

 

처음 블로그에 정리해봤는데

정리가 잘 되었는지 모르겠다ㅠㅠㅠㅠ

 

 

반응형