티스토리 뷰
생각
Github - https://github.com/hellojdh/Code/blob/master/src/baekjoon/q1000/Q1978.java 주어진 숫자들 중 소수의 개수를 출력하여라.
처음 생각
소수를 구할 수 있는 다양한 방법들이 있지만 에라토스테네스 체를 사용하는것이 가장 간단하면서 괜찮은 속력을 보장해주는것 같다. 특히, 이처럼 다양한 숫자들을 검사해야할 때는 매번 소수 판별을 하는 것보다 에라토스테네스 체를 이용해서 한 번에 구해놓는것이 좋다.
▶ 범위가 1000까지 이므로 1000이하의 모든 소수를 구해놓은 뒤, 주어진 숫자들중 소수의 개수를 세어 출력해주었다.
방안
1) Java 풀이
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 | package baekjoon.q1000; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Q1978 { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int[] arr = new int[1001]; // 1은 소수가 아니다 arr[1] = 1; // 에라토스테네스 체(미리 구해놓기) for(int i=2;i<=1000;i++){ for(int j=2;i*j<=1000;j++) arr[i*j]=1; } int result = 0; StringTokenizer st = new StringTokenizer(br.readLine()); while(st.hasMoreTokens()){ int t = Integer.parseInt(st.nextToken()); if(arr[t]==0) result++; } System.out.println(result); } } |
2) Python 풀이
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | n = int(input()) # 1000 이하 소수 미리 찾기 arr = [0 for i in range(1001)] for i in range(2,1001): if arr[i]!=0: continue for j in range(2,1001): if i*j>1000: break arr[i*j]=1 result = 0 # 1은 소수가 아니다 arr[1] = 1 t = list(map(int,input().split())) for i in range(n): if arr[t[i]]==0: result+=1 print(result) |
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 6593번 상범 빌딩 (0) | 2019.04.02 |
---|---|
[백준] 15552번 빠른 A+B (2) | 2018.12.11 |
[백준] 1476번 날짜 계산 (0) | 2018.12.09 |
[백준] 4673번 셀프 넘버 (0) | 2018.12.07 |
[백준] 9095번 1, 2, 3 더하기(DP) (0) | 2018.12.06 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday