-
백준 1929번 소수구하기(Python, Java)Baekjoon 2020. 1. 15. 16:09728x90반응형
https://www.acmicpc.net/problem/1929
1929번: 소수 구하기
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000)
www.acmicpc.net
문제를 보자마자 바로 풀이가 떠올라고 구현을 시작하였다. 그런데? 소수를 구하는 방법에서 내가 효율적인 풀이방법이 떠오른 것은 아니고 그냥 일반적인 풀이를 떠올렸다. 그런데 시간초과가 뜬다. 뭐 고민을 해보다 구글링을 하였다.
구글링을 해보다 알게 된 사실은 소수판별은 해당 수의 제곱근까지만 나눠보면 된다는 것이다.
n, m 사이의 소수구하는 팁
k의 소수를 구하기 위해,
2부터 k/2까지 나눴을때 나누어지는 숫자가 존재하지 않으면 소수이다.
k의 약수는 k/2보다 클수가 없으므로!
수학적으로 좀 더 깊게 생각해보면(글쓴이는 수학적으로 깊게 생각하지 못해서 외우고 있다...)
2부터
까지 살펴보면 된다.
출처: https://hongku.tistory.com/176JAVA :: n까지 모든 소수 구하기, 간단하지만 알아야 하는 코딩
소수를 구하는 문제는 굉장히 중요한 문제이다. 문제해결에 도움이 많이 되는 코딩이므로 알아두자! 문제 정수 n을 입력받아 n까지 모든 소수 구하기 힌트 k의 소수를 구하기 위해, 2부터 k/2까지 나눴을때 나누어..
hongku.tistory.com
위의 블로그에서 좋은 내용이 있어서 가져왔다. 그런데 나도 솔직히 수학을 잘하지 못해서 왜 인지는 잘 모르겠다.
그냥 받아들이려고 한다... 이 내용을 알면 시간초과가 발생하지 않을 것이고 나중에 소수구하는 문제에서도 꿀팁으로 풀 수 있을 것 같다.
1. 소수 구하기(1929번) with Python
12345678910111213141516171819import mathdef isPrime(num):if num == 1:return Falsen = int(math.sqrt(num))for k in range(2, n+1):if num % k == 0:return Falsereturn True# mainm, n = map(int, input().split())for k in range(m, n+1):if isPrime(k):print(k)2. 소수 구하기(1929번) with Java
123456789101112131415161718192021222324252627282930313233import java.util.Scanner;public class Prime {public static void main(String[] args) {Scanner input = new Scanner(System.in);int a = input.nextInt();int b = input.nextInt();for (int i = a; i <=b; ++i) {if (isprime(i)) {System.out.println(i);}}}static boolean isprime(int num) {if (num == 1) {return false;}int n = (int)Math.floor(Math.sqrt(num));for (int k = 2; k < n + 1; ++k) {if (num % k == 0) {return false;}}return true;}}반응형'Baekjoon' 카테고리의 다른 글
백준 뒤집힌 덧셈 1357번(Python, Java) (0) 2020.01.17 백준 베스트셀러 1302번(Python, Java) (0) 2020.01.15 백준 1157번 단어공부(Python, Java) (0) 2020.01.15 백준 1152번 단어의 개수(Python, Java) (0) 2020.01.15 백준 10814번 나이순정렬(python) (0) 2020.01.14