💻STUDY/BOJ

[BOJ] 1929. 소수 구하기 (C,Python3)

coldNoodlePigeon 2022. 1. 24.
  • 코딩 초보. 구현을 목표로 하였기에 비효율적일 수 있습니다.

1929. 소수 구하기 

 

M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.

 

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

 

한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.

 

 


1.Python

 

m,n=map(int,input().split())
prime=[]

#prime list
for i in range(m,n+1):
    prime.append(i)
    
for i in range(2,n+1):
    for j in range(2,n+1):
        s=i*j
        if s>n+1:
            break
        if s in prime:
            prime.remove(s)
#print 
for i in range(len(prime)):
    print("%d" %(prime[i]))

처음에 시간초과가 뜬 코드이다. 일일히 소수가 맞는지를 판별하도록 했는데, 이러면 시간초과가 떴다. 해결방법을 위해서 에라토스테네스의 체를 활용했다.

 

에라토스테네스의 체란, 다수의 자연수에서 소수를 판별할 때 주로 사용하는 알고리즘이다. 수업시간에 배웠듯, 가장 작은 소수로 2를 선택하고 2의 배수를 지워나가고, 그 다음으로 3을 선택해서 3의 배수를 제거해나가는 알고리즘이다. 위 코드도 비슷하게 활용했지만 시간초과가 뜬 이유가 2부터 n까지 모두 검토했기 때문이라고 생각된다. 그래서 이번에는 함수와 제곱근을 이용하여 코드를 새로 짰다. 

 

def prime(num):
    if num==1:
        return False
    else:
        for i in range(2,int(num**0.5)+1):
            if num%i==0:
                return False
        return True

m,n=map(int,input().split())

for i in range(m,n+1):
    if prime(i)==True:
        print(i)

2.C99

 

#include <stdio.h>
#include <math.h>

int prime(int num) {
	if (num == 1) {
		return -1;
	}
	else {
		for (int i = 2; i < (int)sqrt(num) + 1; i ++) {
			if (num % i == 0) return -1; 
		}
		return 1; 
	}
}
main() {
	int m, n;
	scanf("%d %d", &m, &n);

	for (int i = m; i <= n; i++) {
		if (prime(i) == 1) {
			printf("%d\n", i);
		}
	}


}

C언어로도 비슷하게 구현할 수 있다. 

'💻STUDY > BOJ' 카테고리의 다른 글

[BOJ] 1924. 2007년 (Python,C)  (1) 2022.01.25
[BOJ] 2751. 수 정렬하기 2 (Python, C)  (0) 2022.01.25
[BOJ] 1978. 소수 찾기 (C,Python3)  (0) 2022.01.24
[BOJ] 4344. 평균은 넘겠지  (1) 2022.01.23
[BOJ] 10814. 나이순 정렬 (C,Python)  (0) 2022.01.23

댓글