본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 2581번: 소수 -C++

728x90

[백준알고리즘] 2581번: 소수 -C++

2581번: 소수 (acmicpc.net)

 

2581번: 소수

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

www.acmicpc.net

예전에 풀었던 문제다. 파이썬으로 푼 줄 알았는데, 자바로만 예에에에엣날에 풀고 안 풀었던 문제였다.

 

파이썬으로 안 푼 이유는 이전 1978번 소수 문제와 유사해서 안 푼 것 같다.

1978번 문제에 대한 풀이는 아래의 주소에서 했었다.

[백준알고리즘] 1978번: 소수 찾기 -Python, C++ (tistory.com)

 

[백준알고리즘] 1978번: 소수 찾기 -Python, C++

[백준알고리즘] 1978번: 소수 찾기 -Python, C++ https://www.acmicpc.net/problem/1978 1978번: 소수 찾기 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의..

suri78.tistory.com

 

여기서도 마찬가지로 풀기는 한다.

먼저, 에라토스테네스의 체를 채운다. 소수인 인덱스에만 \(true\)로 놔두고 합성수와 1은 \(false\)로 바꿔준다.

이후 들어오는 범위에 대해서 반복문으로 돌아가면서 각 값마다 에라토스테네스의 체를 통해 소수 여부를 확인한다.

 

로직 자체는 쉽다. 마지막에 출력 부분에만 ostringstream을 사용해줬다.

sstream 헤더에 있는 ostringstream은 아래의 코드와 같이 출력문을 정의해줄 때 사용해 줄 수 있다. ostringstream 객체 자체가 스트림 객체이기 때문에 스트림 버퍼로써의 역할을 수행한다. 이후 str() 메서드를 호출해주면서 문자열로 출력한다.

 

삼항다항식에서 : 를 기준으로 좌우의 타입이 같아야 하는 것 같아 앞의 \(minimum\) 값도 to_string을 통해서 문자열로 만들어주었다.

#include <iostream>
#include <sstream>

bool field[10001];

void eratosthenes(void);
void solve(void);

int main(void)
{
	eratosthenes();
	solve();
	return 0;
}

void eratosthenes(void)
{
	std::fill_n(field, 10001, true);

	field[0] = field[1] = false;
	for (int i = 2; i < 5001; i++)
	{
		if (!field[i]) continue;

		int temp = 2;
		while (i * temp <= 10000)
		{
			field[i * temp] = false;
			temp++;
		}
	}
}

void solve(void)
{
	int m, n;
	std::cin >> m >> n;

	int total = 0;
	int minimum = -1;
	for (int i = m; i <= n; i++)
	{
		if (!field[i]) continue;
		if (minimum < 0) minimum = i;
		total += i;
	}

	std::ostringstream oss;
	oss << total << std::endl << minimum;
	std::cout << (minimum < 0 ? std::to_string(minimum) : oss.str());
}

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90