[2581]백준: 소수[c]

지환·2022년 7월 5일
0

백준(C)

목록 보기
33/47
post-thumbnail

출처 | https://www.acmicpc.net/problem/2581

문제

자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.

예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다

입력

입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.

M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.

출력

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.

단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

코드

#include <stdio.h>

int main()
{
	//1.소수를 입력받을 때 범위가 주어진다. [사용자로부터 값을 입력받는다.]
	//2.값을 입력받는 것을 시점으로 총 2가지의 for문 하나는 전체적인 틀을 구성하는 for문[범위] -> 다른 하나는 안에 탐색하는 for문으로 구성
	//3.우리가 처음에 소수를 발견했을 때, -> 이것이 최솟값이 된다. [key 1] 
	//4.j가 아닌 i가 == 2 일경우도 고려해야 된다. i == 2일 경우 밖 for문만 돌아간다. 
	//5. i == 2일때 최솟값, 최댓값 예외처리 
	
	int m, n, key, i, j;
	int sum = 0;
	int min = 0;

	scanf_s("%d %d", &m, &n);

	for (i = m; i < n; i++) //전체 범위
	{
		for (j = 2; j < i; j++) //탐색하는 idea
		{
			if (i % j == 0) break;
			if (j == i - 1) 
			{
				sum += i;
				if (min == 0) // 최솟값을 찾는 조건 
					min = i;
			}
		}
		if (i == 2) //i가 2일때 소수일 조건을 만족하는 경우를 나눠서 예외처리.
		{
			sum += i;
			min = i; //이렇게 되면 최솟값 => 정의 
		}
	}
	if (min != 0)
	{
		printf("%d\n%d", sum, min);
	}
	else
	{
		printf("-1");
	}

}

시간복잡도 O(n^2)

느낀점

  1. 예외처리 잘 나눠서 생각하자.
  2. 시간복잡도를 더 개선할 수 없는지 고민해보자.
profile
아는만큼보인다.

0개의 댓글