Programming/C언어

[백준] 27365번 : 소수가 아닌 수 (C언어 / C99)

20학번컴공과 2023. 2. 13. 17:09
문제

이 대회의 운영진 중 한 명인 KSA 학생은 17시와 19시를 구별할 수 없다. 이는 당연하게도 17 19가 모두 소수이기 때문일 것이다. 시간을 제대로 구별해서 KSA의 명예를 지키기 위해 정수 N을 입력받아서 소수가 아닌 N 이상의 정수를 아무거나 구해주자.

 

 

조건 및 입출력

1. 첫 번째 줄에 정수 N이 주어진다.

2. 정답이 여러 개 존재한다면 아무거나 출력해도 상관없다.

3. 1 <= N <= 10^9

 

 

# 풀이는 2개이다.

 

1번 솔루션: 코드 (C99)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void)
{
	long long nums;
	scanf("%lld", &nums);
	
	if (nums==1 || nums == 2 || nums==3)
	{
		printf("4");
		exit(0);
	}
		
	else
	{
		for (long long i = nums; i < (long long)10e9; i++)
		{
			for (long long j = 2; j < (long long)(sqrt(nums) + 1); j++)
				if (i % j == 0)
				{
					printf("%lld", i);
					exit(0);
				}
		}
	}
}

 

 

2번 솔루션 : 코드 (C99)
#include <stdio.h>

main()
{
	printf("1000000000");
}

 

 

풀이 과정

1번 솔루션:

 

단순히 에라토스테네스의 채를 떠올려서 풀이해도 된다.

단, 파이썬에서 에라토스테네스의 채를 구현해서 실행하면 시간 초과가 된다.

(C가 빨라서 다행이 통과가 되긴 했다만...)

 

입력값으로 1~3의 정수가 주어지면 소수가 아닌 첫 번 째 정수는 4이므로, 4를 출력한다. 

그렇지 않을 경우 주어진 수 부터 시작해서 10^9까지 루프(i)를 돌리고, 그 안에 2부터 시작하는 루프(j)를 돌린다.

i%j==0이면 소수가 아니므로 그 수를 출력하면 된다.

 

소수가 아닌 수를 찾는 즉시 더 이상 프로그램이 돌아갈 이유가 없으므로 exit(0)으로 프로그램을 종료시킨다.

 

 

2번 솔루션:

 

정답을 맞추고 나서, 다른 사람들은 어떻게 풀었는지 확인 해보았다.

사람들은 참 똑똑한 것 같다는 생각을 했다.

 

문제에서, N이상의 수 중에서 소수가 아닌 정수 아무거나 출력해도 된다는 말이 있다.

 

그리고 N의 범위는 1부터 10^9까지이다.

N 이상의 수는 최소값은 1, 최댓값은 10^9이다.

1을 입력했을 때 1이상의 수, 10^9를 입력하면 10^9이상의 수 중에서 소수가 아닌 수 아무거나 출력하면 된다.

 

10^9는 소수가 아니다. 

결국 10^9를 출력하면 그만이다.

어떤 수를 입력해도 최댓값은 10^9이고, 10^9는 소수가 아니기 때문이다.

 

 


 

코드가 이상하거나, 이해되지 않는 부분이 있다면 댓글 남겨주세요!

+ 더 좋은 풀이 방법이 있다면 알려주세요 :)