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

 

1929번: 소수 구하기

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

www.acmicpc.net

백준 1978, 2581과 비슷하게 소수를 구하였는데,

 

시간초과가 일어났다.

 

 

왜 시간초과가 일어났는지 보니깐,

for문으로 2부터 그 수까지 계속 확인해보는게 문제였다.

 

참고링크 ↓↓

 

 

설명을 해보자면

소수를 구하는 수를 18이라고 생각하면

2부터 18까지 일일이 나눠보고, 나눠떨어지는 여부를 확인 할 것이다.

 

그치만, 18의 약수를 생각해보면,

1, 2, 3, 6, 9, 18가 있다.

 

1, 2, 3, 6, 9, 18 이렇게 보면 

1 * 18 = 18

2 * 9 = 18

3 * 6 = 18 이다.

 

이 관계를 보자면,

18 / 2 = 9

18 / 3 = 6

-----------------

18 / 6 = 3

18 / 9 = 2

 

 

일정 값을 기준으로 몫과 나눈 값이 반대로 바꿔서 나누는 것을 볼 수가 있다.

 

 

따라서, 18의 제곱근인 4.2426..까지만 확인해본다면

그 나머지 연산은 나눈는 몫과 나눈 값이 반대로 바뀌게 되는 연산이기 때문에

굳이 확인 할 필요가 없다는 말이다. 

 

그래서 확인 하고자하는 수의 제곱근을 구하여

제곱근 까지 나눠 확인을 하였다.

 

소스코드 ↓

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

int main() {
	int start, end;
	int count = 0;
	int sqrt_start;
	scanf("%d %d", &start, &end);
	for (; start <= end; start++) {
		count = 0;
		sqrt_start = sqrt(start);
		for (int i = 1; i <= sqrt_start; i++) {
			if (start % i == 0) {
				count++;
				if (count > 2)
					break;
			}
		}
		if (count == 1 && start != 1) {
			printf("%d\n", start);
		}
	}
	
	return 0;
}

'Coding Test > Problem_solving' 카테고리의 다른 글

[백준] 9012_괄호  (0) 2021.02.18
[백준]9093_단어 뒤집기  (0) 2021.02.18
[백준] 4948_베르트랑 공준  (0) 2021.02.14
[백준]2581_소수  (0) 2021.02.12
[백준]1978_소수 찾기  (0) 2021.02.12

+ Recent posts